정보과학 IT

INDEX_SS와 바인드 변수

물곰탱이 2012. 11. 12. 16:17

INDEX_SS와 바인드 변수

 

월말이 되면 20분간 돌고 실제로 인서트는 아무것도 하지 않는 프로시저가 있다. 대부분의 경우는 데이터가 없기 때문에 안돌아도 상관없지만 어쩌면 필요한지도 몰라서 없애지는 못하면서 이 프로그램의 후행작업은 20분씩 뒤로 밀려서 늦게 돈다.

한달치를 SUM하기 위해 하나의 파티션을 사용하고 꽤 오래 걸릴것 같지만 쿼리를 아래와같이 바꿔주면 금방 끝난다. 인덱스는 날짜, 코드1,코드2,코드3 순으로 되어있다.

SELECT /*+ INDEX_SS(A TBL1_N2) */ SUM(A.AMT)
FROM TBL1 A
WHERE A.DT BETWEEN '20101001'
AND '20101031'
AND A.CODE_1 = '13'


하지만 힌트를 주고 PL/SQL 스토어드 프로시저를 컴파일 한 후에 실행시켜보면 여전히 느렸다. 아마도 바인트 변수를 사용하는 경우에는 Skip Scan으로 플랜이 안나오는데 그 이유가 있는 것 같다. 아래의 쿼리는 똑같은 쿼리에 변수만 바꿔놓은 것인데 range scan으로 실행된다.

SELECT /*+ INDEX_SS(A TBL1_N2) */ SUM(A.AMT)
FROM TBL1 A
WHERE A.DT BETWEEN :T_STDT
AND :T_EDDT
AND A.CODE_1 = '13'

그러면 스킵 스캔을 사용하기 전 적용해보았던 전통적인(?) 방법인 날짜 테이블을 뷰로 만들어 IN literator를 발생시키는 방법 을 사용해보면 이 방법이 스킵스캔과는 같지 않다는 것을 알 수 있을 것이다. 비슷한것 같지만 INDEX_SS만큼 재빠르게 동작하지는 않는다.

SELECT /*+ INDEX(A TBL1_N2) */ SUM(A.AMT)
FROM TBL1 A
WHERE A.DT IN (SELECT DT FROM DT_TBL1 WHERE DT BETWEEN :T_STDT AND :T_EDDT) AND A.CODE_1 = '13'

 

 

http://blog.naver.com/jaavaa/150096546758