본문 바로가기
DBMS/SQL튜닝

INLIST ITERATOR 성능개선(where 절 in 조건)

by 드바 2023. 6. 29.

 

INLIST ITERATOR 오퍼레이션은 인덱스 수직 탐색으로 인해 과도한 블록 I/O를 발생할 수 있다.
조회 범위가 넓지 않다면 RANGE SCAN 후 FILTER 처리로 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_IX01 ON t1 (c1, c2);

 

2. 아래 쿼리는 IN 절로 10개의 행을 조회했다. 실행 계획 2번 Starts에서 t1_x1 인덱스가 10번 액세스된 것을 확인할 수 있다. 이로 인해 14개의 블록 I/O가 발생했다.

SELECT *
  FROM t1
 WHERE c1 IN (2, 4, 6, 8, 10, 12, 14, 16, 18, 20);

------------------------------------------------------------------------------
| Id  | Operation	  | Name    | Starts | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	    |	   1 |	   10 |00:00:00.01 |	  14 |
|   1 |  INLIST ITERATOR  |	    |	   1 |	   10 |00:00:00.01 |	  14 |
|*  2 |   INDEX RANGE SCAN| T1_IX01 |	  10 |	   10 |00:00:00.01 |	  14 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(("C1"=2 OR "C1"=4 OR "C1"=6 OR "C1"=8 OR "C1"=10 OR "C1"=12 OR "C1"=14 OR "C1"=16 OR
	      "C1"=18 OR "C1"=20))

 

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 |	 A-Time   | Buffers |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT |	   |	  1 |	  10 |00:00:00.01 |	  4 |
|*  1 |  INDEX RANGE SCAN| T1_IX01 |	  1 |	  10 |00:00:00.01 |	  4 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("C1">=2 AND "C1"<=20)
       filter(("C1"+0=2 OR "C1"+0=4 OR "C1"+0=6 OR "C1"+0=8 OR "C1"+0=10 OR "C1"+0=12 OR "C1"+0=14
      OR "C1"+0=16 OR "C1"+0=18 OR "C1"+0=20))

 

 

 

 

 

 

댓글