반응형

Oracle/튜닝 13

INDEX RANGE SCAN 과 FULL TABLE SCAN

INDEX RANGE SCAN 과 FULL TABLE SCAN : FULL TABLE SCAN은 테이블의 블록들을 DB_FILE_MULTIBLOCK_READ_COUNT 파라메터에 지정된 개수 단위로 읽음 : INDEX RANGE SCAN은 블록 단위로 읽음 : 그렇다면 언제나 FULL TABLE SCAN이 유리한 것인가? 그렇지 않다. 예를 들어, DB_FILE_MULTIBLOCK_READ_COUNT가 16이라고 가정하고, 16개의 블록을 읽어야 한다면 INDEX SCAN과 같은 Single Block I/O는 총 16회, FULL TABLE SCAN과 같은 Multi Block I/O는 1회 소요 하지만, Single Block I/O의 1회당 소요 시간과 Multi Block I/O의 1회당 소요 시..

Oracle/튜닝 2022.02.16

클러스터링 팩터(CLUSTERING FACTOR)

클러스터링 팩터(CLUSTERING FACTOR) : 인덱스에 저장된 순서와 테이블에 저장된 데이터의 저장 순서가 얼마나 일치하는지를 나타내는 값 : 최대값은 인덱스에 저장된 항목의 개수 : 최소값은 테이블 블록의 개수 클러스터링 팩터가 좋은 경우 : 인덱스의 정렬 순서와 테이블에 저장된 행의 저장 순서가 일치하는 경우 클러스터링 팩터가 나쁜 경우 : 인덱스의 정렬 순서와 테이블에 저장된 행의 저장 순서가 일치되지 않는 경우 ex) 클러스터링 팩터가 좋은 경우, 읽게 되는 블록수 확인 CREATE TABLE CUST_GOOD_CF AS SELECT * FROM CUSTOMERS ORDER BY CNAME; CREATE INDEX CUST_GOOD_CF_IDX ON CUST_GOOD_CF(CNAME); S..

Oracle/튜닝 2022.02.16

INDEX 컬럼 가공

INDEX 컬럼 가공 : 인덱스가 정의된 컬럼을 가공하면 인덱스를 활용 할 수 없음 1. 명시적 형변환 : 사용자가 고의적으로 컬럼을 변형 2. 암시적 형변환 : 문자를 숫자나 날짜로 변환 [실습:명시적 형변환] SELECT /*+ gather_plan_statistics INDEX(products PRODUCTS_PRICE_IDX)*/ * FROM products WHERE price BETWEEN 3350 AND 4500; CREATE INDEX PRODUCTS_PRICE_IDX ON PRODUCTS(PRICE); SQL_ID 1q4y0g7cm79ph, child number 0 ------------------------------------- SELECT /*+ gather_plan_statist..

Oracle/튜닝 2022.02.11

INDEX RANGE SCAN(MIN/MAX)

INDEX RANGE SCAN(MIN/MAX) - RANGE SCAN 을 통해 MIN/MAX 값만 읽는 Operationn 해당 Operation 테스트를 위해 아래와 같이 결합인덱스를 생성한다. CREATE INDEX PRODUCTS_IDX ON PRODUCTS(PSIZE, PRICE); [결합 인덱스 구조] PSIZE, PRICE 컬럼 순으로 정렬되어 인덱스의 리프 블록에 저장된다. 리프 블록을 다음과 같이 간략하게 표시 : PSIZE, PRICE, ROWID 순으로 정렬 [인덱스 리프블록] PSIZE='XL'인 PRICE 최대값 PSIZE PRICE ROWID PSIZE PRICE ROWID PSIZE PRICE ROWID PSIZE PRICE ROWID 2XL 1200 3XL 1450 L 1160..

Oracle/튜닝 2022.02.11

INDEX RANGE SCAN DESCENDING

INDEX RANGE SCAN DESCENDING : INDEX RANGE SCAN에서는 조건절의 범위를 검색 할 때, 기본적으로 최소 경계값부터 검색을 시작하여 최대 경계값에서 검색을 종료 : 만약, 최대 경계값에서 검색을 시작하여 최소 경계값에서 검색을 종료해야하는 경우에 사용 [INDEX RANGE SCAN DESCENDING B-Tree 구조] [실습] SELECT /*+ INDEX_DESC(products products_price_idx) */ * FROM products WHERE price BETWEEN 3350 AND 4500; * 힌트 설명 1) INDEX_DESC : 인덱스를 내림차순으로 검색 2) INDEX_ASC, INDEX : 인덱스를 오름차순으로 검색 select * from ..

Oracle/튜닝 2022.02.10

INDEX RANGE SCAN

INDEX RANGE SCAN : INDEX UNIQUE SCAN을 제외한 모든 INDEX SCAN은 INDEX RANGE SCAN 이다. : 고유 인덱스가 정의된 컬럼이 조건절에서 '=' 비교 연산자를 제외한 모든 연산자로 비교되는 경우 : 비고유 인덱스가 정의된 컬럼이 조건절에 기술되는 경우 [INDEX RANGE SCAN B-Tree 구조] [실습] SELECT /*+ gather_plan_statistics */ * FROM products WHERE PRICE BETWEEN 3350 AND 4500; select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST')); [PLAN] SQL_ID 8ssw9b2n9hmsx..

Oracle/튜닝 2022.02.10

INDEX UNIQUE SCAN

INDEX UNIQUE SCAN : 고유 인덱스가 정의된 컬럼이 조건절에서 '=' 로 비교되는 경우 그 외의 경우는 전부 INDEX RANGE SCAN 발생 [실습] SELECT /*+ gather_plan_statistics */ * FROM products WHERE prodno = 11000; -- PRODUCTS_PK : PRODNO select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST')); [PLAN] SQL_ID g2gb0h3jzw95t, child number 0 ------------------------------------- SELECT /*+ gather_plan_statistics */ * FR..

Oracle/튜닝 2022.02.10

B-Tree 인덱스 구조

B-Tree 인덱스 구조 루트 블록 : 브랜치 블록의 블록 주소, 인덱스 컬럼 값으로 구성 브렌치 블록 : 리프 블록의 블록 주소, 인덱스 컬럼 값으로 구성 리프 블록 : 인덱스 컬럼, 테이블 ROWID로 구성 인덱스 컬럼으로 정렬되어 있으며, 컬럼 값이 같으면 ROWID 로 정렬 CREATE INDEX products_price_idx ON products(price); -- products 테이블의 price 컬럼에 비고유 인덱스 생성 1. products 테이블 전체를 읽고, price로 오름차순 정렬한다. 2. 정렬된 price 값과 해당 값이 포함된 행의 ROWID를 첫 번째 리프 블록부터 채워 넣는다. 3. 리프 블록이 완성되면, 각 리프 블록의 첫 번째 price 값과 해당 리프 블록의 주소..

Oracle/튜닝 2022.02.10

FULL TABLE SCAN

FULL TABLE SCAN : 테이블에 할당된 첫번째 블록부터 HWM 아래의 모든 블록을 읽음 : 1회의 I/O에 대해서 여러 개의 블록을 읽음 : DB_FILE_MULTIBLOCK_READ_COUNT 파라메터로 한 번에 읽어야 할 블록의 개수를 지정 SELECT NAME, VALUE, ISSYS_MODIFIABLE FROM V$PARAMETER WHERE NAME = 'db_file_multiblock_read_count'; NAME VALUE ISSYS_MODIFIABLE db_file_multiblock_read_count 128 IMMEDIATE => 1회의 I/O 당 128개의 블록을 읽음, 시스템과 OS 따라 달라짐 => ISSYS_MODIFIABLE=IMMEDIATE 재기동 없이 바로 적용..

Oracle/튜닝 2022.02.10

실행계획 순서분석

B+Tree 의 First Order 방식의 읽는 순서 - 자식 중의 종손 먼저 - 하위 tree 가 있다면 하위 다 읽고 다음 형재로 예) SELECT /*+ gather_plan_statistics */ O.PAYTYPE, O.STATUS, O.CUSTNO, OD.PRICE FROM ORDERS O, ORDERDETAILS OD WHERE O.ORDERNO = OD.ORDERNO AND O.PAYTYPE ='계좌이체' AND STATUS = '결제완료' PLAN_TABLE_OUTPUT SQL_ID 4bwaukvdmsqhs, child number 0 ------------------------------------- SELECT /*+ gather_plan_statistics */ O.PAYTYPE,..

Oracle/튜닝 2022.01.28
반응형