티스토리 뷰

Oracle/Oracle-SQL

index skip scan

니플하임_ 2007.05.23 13:36
서론

index skip scan 이라는 방식의 scan을 이용하여 좀 더 편하게/빠르게 쿼리를 해보자.
이 말이 주는 느낌이 신뢰감을 주고주지않고를 떠나, 사실 그대로를 편하게 이해할 수 있으면 하는 바램이다

본론

select c from tab1 where a = 1 and b = 1

이라는 쿼리가 있다고 하자.
tab1은 (a, b) 두 컬럼에 대해서 인덱스가 걸려있다고 가정한다.

분포도가 좋건 안좋건 바로 결과가 나온다
헌데 a는 모든 로우에 대해서 모두 '1'값을 가지고 있다고 하면,
a는 무의미 하지 않겠는가.

무의미 한걸 빼고 쿼리할 수 있도록 하자.. 라는게 바로 index_skip_scan 이다.
해서 우리는 다음과 같이 쿼리를 날릴수 있게 되었다.
select c from tab1 where b = 1

헌데 explain(실행계획)을 보면, tab1을 full scan 한다고 나올것이다.
(기초적인 내용이라 실행도 안시켜봤으니 이해바람 ㅡㅡ;)
하여, 인덱스 스킵스캔(index_ss) 힌트를 주어 이 쿼리가 정상적으로 index를 사용할 수 있도록 만들수 있다.

아래와 같이 하면 된다.
select /*+ index_ss(tab1 tab1_idx1) */ c from tab1 where b = 1

.....................뭐지?

헌데 index_ss를 사용하기 위해선 다음과 같은 선행조건이 있다.
1. 관련 테이블에 대한 analyze/통계 정보가 정확하게 만들어져 있어야 한다.
2. 선택조건이 좋은 컬럼과 나쁜 컬럼 두개에 대해서 복합 인덱스가 생성되어 있어야 한다.

ㅡㅡ; 음냥...
굳이 이런것에 씨니컬할 필요는 없지만..
그냥 이렇게 쓰고 통계자료 안만들면 안될까.
select /*+ index(tab1 tab1_idx1) */ c from tab1 where a = 1 and b = 1

아 훈늉하다. 생각할 것도 없고. ^^
오라클은 오라클이어야지 마이SQL이 되지 않았으면 좋겠다아..
==> 글쓴이가 생각해보니 글을 쓰는 것 자체에 대해 후회되는 관계로 이번회에는 결론이 없습니다.
댓글
댓글쓰기 폼