DBDBDEEP
3.1.5 인덱스만 읽고 처리 본문
SELECT 부서번호, SUM(수량)
FROM 판매집계
WHERE 부서번호 LIKE '12%'
GROUP BY 부서번호;
인덱스가 부서번호 단일 컬럼으로 이루어져 있을 때 비효율은 없는 것을 확인할 수 있다.
부서번호 LIKE 조건에 해당하는 데이터를 찾고 테이블을 액세스 한 후에 버리는 데이터가 없다.
비효율이 발생하더라도 '인덱스 스캔' 과정에서 얻은 데이터가 많다면 그만큼 테이블 랜덤 액세스가 많이 발생하므로 성능이 느릴 수 밖에 없다.
* 테이블 랜덤액세스가 발생하는 이유는 SUM(수량)을 읽어와야 하기 때문이다.
성능을 개선하려면 어떻게 해야할까?
인덱스에 부서번호 컬럼 뿐만이 아니라 수량 컬럼을 추가해서
테이블 액세스가 아예 발생하지 않게 하는 방법을 고려할 수 있다.
인덱스만 읽어서 처리하는 쿼리 : 'Covered 쿼리'
그 쿼리에 사용한 인덱스 : 'Coverd 인덱스'
쿼리에 컬럼이 많으면 실제 적용하기 곤란할 수 있다.
| CREATE TABLE T1 (C1 NUMBER, C2 NUMBER); INSERT INTO T1 SELECT TRUNC(DBMS_RANDOM.VALUE(1,10000)), TRUNC(DBMS_RANDOM.VALUE(1,10000)) FROM DUAL CONNECT BY LEVEL <=100000; SQL> select * from t1; 9 rows selected. Total elapsed time 00:00:00.032858 SQL ID: 9gffdbmw43rt4 Child number: 1243 Plan hash value: 1585140980 Execution Plan ------------------------------------------------------------------------------------- 1 TABLE ACCESS (FULL): T1 (Cost:194, %%CPU:2, Rows:20) Predicate Information ------------------------------------------------------------------------------------- 1 - filter: ("T1"."C1" = 1234) (0.000) Note ------------------------------------------------------------------------------------- 1 - dynamic sampling used for this table (98 blocks) SQL> create index idx_01 on t1(c1); SQL> select * from t1 where c1=1234; 9 rows selected. Total elapsed time 00:00:00.026577 SQL ID: 9gffdbmw43rt4 Child number: 1245 Plan hash value: 3502323929 Execution Plan ------------------------------------------------------------------------------------- 1 TABLE ACCESS (ROWID): T1 (Cost:22, %%CPU:0, Rows:20) 2 INDEX (RANGE SCAN): IDX_01 (Cost:2, %%CPU:0, Rows:20) Predicate Information ------------------------------------------------------------------------------------- 2 - access: ("T1"."C1" = 1234) (0.000) Note ------------------------------------------------------------------------------------- 2 - dynamic sampling used for this table (98 blocks) SQL> drop index idx_01; SQL> create index idx_01 on t1(c1,c2); SQL> select /*+ INDEX(t1 IDX_01) */ * from t1 where c1=1234; Total elapsed time 00:00:00.000758 SQL ID: c7vxz0y2d1ygn Child number: 1238 Plan hash value: 1717286592 Execution Plan ------------------------------------------------------------------------------------- 1 COLUMN PROJECTION (Cost:2, %%CPU:0, Rows:20) 2 INDEX (RANGE SCAN): IDX_01 (Cost:2, %%CPU:0, Rows:20) Predicate Information ------------------------------------------------------------------------------------- 2 - access: ("T1"."C1" = 1234) (0.000) |
위와 같이 SELECT-LIST 에 있는 컬럼을 모두 포함시킨 인덱스를 사용할 경우
성능이 훨씬 좋아지는 것을 확인할 수 있다.
* Column Projection이란 실행 계획의 특정 단계에서 어떤 Column을 추출하는가를 의미한다.
'친절한 SQL 튜닝' 카테고리의 다른 글
| 3.3.3 액세스/필터 조건 (0) | 2026.05.18 |
|---|---|
| 3.2.3 배치 I/O (0) | 2026.05.18 |
| 3.1.2 Index Clustering Factor (0) | 2026.05.16 |
| 2.3 인덱스 확장기능 (0) | 2026.05.16 |
| 2.2.7 자동 형변환 (0) | 2026.05.16 |