토드에서 같은 쿼리를 plan 확인 시
1번 쿼리 처럼 where에 값을 직접 설정하고 PLAN 을 한 경우와
2번처럼 변수를 바인딩하고 PLAN 계획은 같은데 COST 가 다르게 나옵니다.
왜 이런 경우가 발생하는지와 제가 이해를 못한 이유를 설명 좀 부탁 드립니다.
1번 / 2번 실행 시 같은 값으로 쿼리를 실행하면 쿼리 시간도 상당한 차이를 보입니다.
SETTL_TXN 은 PARTITION 테이블이며 SETTL_TXN_IDX01 은 Global Index 로 ID, REG_DT 컬럼으로 되어 있음
2번 쿼리는 INDEX 힌트를 별도로 주지 않더라도 똑같은 실행 PLAN 으로 실행됨.
1번 쿼리
SELECT /*+ INDEX(SETTL_TXN SETTL_TXN_IDX01) */
SETTL_NO
FROM SETTL_TXN
WHERE ID = 'honggd'
AND REG_DT >= TO_DATE('201608', 'YYYYMM')
AND REG_DT < TO_DATE('201609', 'YYYYMM')
GROUP BY SETTL_NO
1번 PLAN
SELECT STATEMENT ALL_ROWSCost: 49,501 Bytes: 170 Cardinality: 1
4 HASH GROUP BY Cost: 49,501 Bytes: 170 Cardinality: 1
3 FILTER
2 TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED TABLE SETTL_TXN Cost: 49,500 Bytes: 170 Cardinality: 1 Partition #: 3 Partition access computed by row location
1 INDEX RANGE SCAN INDEX SETTL_TXN_IDX01 Cost: 210 Cardinality: 31
2번 쿼리
SELECT /*+ INDEX(SETTL_TXN SETTL_TXN_IDX01) */
SETTL_NO
FROM SETTL_TXN
WHERE ID = :ID
AND REG_DT >= TO_DATE(:BEGIN_REG_DT, 'YYYYMM')
AND REG_DT < TO_DATE(:END_REG_DT, 'YYYYMM')
GROUP BY SETTL_NO
:ID = 'honggd'
:BEGIN_REG_DT = '201608'
:END_REG_DT = '201609'
2번 PLAN
SELECT STATEMENT ALL_ROWSCost: 6 Bytes: 130 Cardinality: 1
4 HASH GROUP BY Cost: 6 Bytes: 130 Cardinality: 1
3 FILTER
2 TABLE ACCESS BY GLOBAL INDEX ROWID BATCHED TABLE SETTL_TXN Cost: 5 Bytes: 130 Cardinality: 1 Partition #: 3 Partition access computed by row location
1 INDEX RANGE SCAN INDEX SETTL_TXN_IDX01 Cost: 3 Cardinality: 1
|