2011-12-06 3 views
1

나는 작거나 큰 연산자를 사용하여 테이블을 쿼리 할 때 SQL Server 인덱스가 제대로 작동하지 않는다는 것을 발견했습니다.보다 작거나 큰 SQL 서버의 인덱스에 대한 연산자 문제

SELECT * TestTable FROM WHERE iCount = 10 :이하여 테이블을 쿼리 지금

Column Name, column type, primary Key, index 
iID,   int,   yes,   cluster index 
iCount,  int,   no,   non-cluster index 
name,  nvarchar(255), no,  no index 

:

내가이 같은 단지 2 열이있는 간단한 테이블 (TestTable)을 말해봐

아주 좋겠지 만 SQL Server는 iCount 열에 대해 비 클러스터 인덱스를 사용하여 결과를 검색합니다.

그러나, 나는 이것에 의해 테이블을 조회 할 경우 :

SELECT * TestTable FROM WHERE iCount < 10,

IID를위한 클러스터 인덱스를 통해 인덱스 스캔을 할 것입니다

는 SQL 서버 결과를 검색하십시오.

SQL Server가 쿼리에서 작거나보다 큰 연산자를 사용할 때 적절한 인덱스를 사용할 수없는 이유가 궁금합니다.

+0

클러스터 된 인덱스를 '(iCount, iID)'** 순으로 변경하는 것이 좋습니다 **. – onedaywhen

+0

또는 기본 키의 특성을 변경할 필요가없는 iCount의 클러스터되지 않은 인덱스에 'name'을 포함 된 열로 추가 할 수 있습니다. – hatchet

답변

4

테이블에 행이 거의없는 경우 SQL Server는 클러스터되지 않은 인덱스를 사용하고 클러스터 된 인덱스의 나머지 열을 조회하는 대신 클러스터 된 인덱스를 스캔하는 것이 경제적입니다. 이 경우 쿼리를 SELECT iCount FROM ...으로 변경하면 쿼리 계획이 예상대로 인덱스를 사용하도록 변경됩니다.