Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

DBDBDEEP

3.1.5 인덱스만 읽고 처리 본문

친절한 SQL 튜닝

3.1.5 인덱스만 읽고 처리

Kihwane 2026. 5. 16. 20:25

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