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))
'DBMS > SQL튜닝' 카테고리의 다른 글
ORDER BY 컬럼명이 가리키는 컬럼은? (0) | 2023.07.03 |
---|---|
펑션 위치별 실행 횟 수 (0) | 2023.07.02 |
스칼라서브쿼리 실행계획 순서 및 실행통계 (0) | 2023.06.28 |
SELECT 절 펑션 수행 횟수 확인 (0) | 2023.06.26 |
스칼라 서브쿼리 캐싱 및 버퍼 pinning (0) | 2022.05.24 |
댓글