일or놀이/MS-SQL

인덱스를 사용하지 않는 경우

TIGERJUNE 2006. 8. 28. 17:21
인덱스를 사용하지 않는 경우

인덱스 컬럼은 비교되기 전에 변형이 일어나면 인덱스를 사용할수 없다.
그러나 인덱스 컬럼을 변형시키지 않고서도 비교되는 상태 컬럼(혹은 상수)의 변형을 통해 거의 모든 경우를 표현해 낼 수 있다.
인덱스 컬럼의 변형은 사용자의 코딩에 의해서 뿐만 아니라 내부적으로 DBMS가 스스로 변형을 일으킬 수도 있다.
이러한 성질을 역이용하여 고의적인 변형(Suppressing)을 통해 원하는 액세스 경로로 유도하기도 한다.

부정형(Not, <>) 으로 조건을 기술한 경우에도 인덱스를 사용하지 않는다.
인덱스 컬럼은 비교되는 상수값과 B*TREE 방식으로 스트링을 비교하여 찾는것이므로 주어진 값이 아닌 값을 찾는 부정형 조건에는 직접 비교해야 할 값이 존재하지 않으므로 논리적으로 볼 때 이미 비교할 방법이 없다.
물론 부정형으로 작성된 SQL도 상당부분 긍정형으로 바꾸어 인덱스를 사용하게 할 수 있다.

인덱스 컬럼이 NULL로 비교되면 사용될 수 없다.
그것은 컬럼의 값이 NULL인 로우는 인덱스에 저장되지 않기 때문이다.
물론 여러 컬럼으로 구성된 결합 인덱스의 첫번째 컬럼이 아닌 값을 NULL로 비교하는 경우에도 인덱스가 사용된다.

옵티마이저가 필요에 따라 상기 적용원칙을 준수했음에도 불구하고 특정 인덱스의 사용을 취사 선택함으로써 사용되지 않는 인덱스가 생길 수 있다.
이는 인덱스 머지(Merge)를 피하기 위해서나, 조건의 순위(Ranking)에 차이가 있을때의 취사 선택, 사용자의 힌트, 통계정보에 의거하여 산출된 액세스 비용(Cost)의 차이 등의 이유로 발생되며 옵티마이저 모드에 따라 서로 다를 수도 있다.