조회 컬럼과 변수의 데이터 타입을 맞추자
CREATE TABLE T1 AS
SELECT 1000000-(LEVEL-1) C1
,TO_CHAR(SYSDATE-(LEVEL-1),'YYYYMMDD') C2
FROM DUAL
CONNECT BY LEVEL <= 1000000
CREATE INDEX IDX_T1_01 ON T1(C1);
CREATE INDEX IDX_T1_02 ON T1(C2);
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'BSHMAN'
,TABNAME=>'T1'
,ESTIMATE_PERCENT=>99
,METHOD_OPT=>'FOR ALL INDEXED COLUMNS'
,GRANULARITY=>'ALL'
,CASCADE=>TRUE
,NO_INVALIDATE=>FALSE);
END;
컬럼 데이터 타입 - VARCHAR2(8)
변수 데이터 타입 - NUMBER
SELECT *
FROM T1
WHERE C2= 20110124
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 26 | 647 (10)| 00:00:08 |
|* 1 | TABLE ACCESS FULL| T1 | 2 | 26 | 647 (10)| 00:00:08 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("C2")=20110124) ----> 내부에서 컬럼변형으로 인덱스를 사용하지못함
컬럼 데이터 타입 - NUMBER
변수 데이터 타입 - VARCHAR2
SELECT *
FROM T1
WHERE C1='111111';
Plan hash value: 3018735338
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 13 | 4 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T1_01 | 1 | | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("C1"=111111) <---- 컬럼 변형없이 인덱스 스캔처리
- 강좌 URL : http://www.gurubee.net/lecture/3818
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.