Oracle/Tuning2018. 12. 26. 09:41

INLIST ITERATOR 오퍼레이션은 인덱스 수직 탐색으로 인해 과도한 블록 I/O를 발생할 수 있다.


테스트를 위해 아래와 같이 테이블을 생성하자.

-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 AS SELECT ROWNUM AS c1, LPAD ('X', 10, 'X') AS c2 FROM XMLTABLE ('1 to 1000000');
CREATE INDEX t1_x1 ON t1 (c1, c2);

아래 쿼리는 IN 절로 10개의 행을 조회했다. 실행 계획 2번 Starts에서 t1_x1 인덱스가 10번 액세스된 것을 확인할 수 있다. 이로 인해 14개의 블록 I/O가 발생했다.[각주:1]
-- 2
SELECT *
  FROM t1
 WHERE c1 IN (2, 4, 6, 8, 10, 12, 14, 16, 18, 20);

---------------------------------------------------------------
| Id  | Operation         | Name  | Starts | A-Rows | Buffers |
---------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |      1 |     10 |      14 |
|   1 |  INLIST ITERATOR  |       |      1 |     10 |      14 |
|*  2 |   INDEX RANGE SCAN| T1_X1 |     10 |     10 |      14 | -- !
---------------------------------------------------------------

조회 범위가 넓지 않다면 아래와 같이 쿼리를 변경하여 쿼리의 성능을 개선할 수 있다.
-- 3
SELECT *
  FROM t1
 WHERE c1 BETWEEN 2 AND 20
   AND c1 + 0 IN (2, 4, 6, 8, 10, 12, 14, 16, 18, 20);

--------------------------------------------------------------
| Id  | Operation        | Name  | Starts | A-Rows | Buffers |
--------------------------------------------------------------
|   0 | SELECT STATEMENT |       |      1 |     10 |       4 |
|*  1 |  INDEX RANGE SCAN| T1_X1 |      1 |     10 |       4 | -- !
--------------------------------------------------------------


  1. 인덱스 루트 블록과 브랜치 브록에 의한 Buffer Pinning으로 인해 블록 I/O가 감소한 것이다. [본문으로]

'Oracle > Tuning' 카테고리의 다른 글

UNION ALL 연산자의 Top-N 동작  (0) 2018.12.31
조건 기술에 따른 MERGE 문의 성능 차이  (0) 2018.12.26
PX SEND 1 SLAVE 오퍼레이션  (0) 2018.12.21
PX SELECTOR 오퍼레이션  (0) 2018.12.19
PRECOMPUTE_SUBQUERY 힌트  (0) 2018.12.14
Posted by 정희락_