2009-06-08 3 views
4

저는 SQL Server 2008을 사용하고 있습니다. 테이블 중 하나에서 식별자에 (클러스터 된) 기본 키를 구현했습니다. 다음은 테이블 설명입니다 :기본 키가 내 쿼리를 느리게하는 이유는 무엇입니까?

식별자 : - IdentifierId INT NOT NULL PK - 별칭 NVARCHAR (200) - NULL NOT 데이터 유형 INT

내가 두 개의 인덱스를 만든 : 별칭 하나와 데이터 형식에 대한 또 하나. 그러나, 나는 단지 이상한 것을 알아 차렸다. 다음 쿼리를 실행하는 경우 :

SELECT * FROM IDENTIFIER WHERE DataType = 1 

는 쿼리가 실제로 느린 인덱스 그들없이보다 기본 키와 실행을; 약 10 초 더 오래 걸립니다! 색인은 조각화되지 않았습니다. 확인했습니다. 또한이 내용은 쿼리 자체 앞에

GO 
CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO 
DBCC FREEPROCCACHE; 
GO 

앞에 나와 있습니다.

이 테이블은 다소 커서 수백만 개의 항목이 있습니다. 인덱스와 PK는 대부분의 쿼리에서 중요한 역할을 담당하지만이 경우 쿼리가 실행되는 이유를 이해할 수 없습니다. 느림보 어떤 아이디어? 미리

덕분

편집 : 실행 계획 작성 만 클러스터 인덱스가 사용되는 상기 데이터 유형 변수은 150

+0

작성된 실행 계획을 살펴 보셨습니까? –

+0

데이터 유형 열은 얼마나 선택적입니까? (즉, 해당 열이 얼마나 많은 값을 가질 수 있습니까?)? –

+0

그냥 대답 : 클러스터 된 인덱스 및 데이터 형식 만 1에서 150 –

답변

5

까지가는 것을 알 복합 비 집단으로 DataType 인덱스를 덮는 열 Alias을 포함하고 AliasDataType 열을 개별 인덱스를 제거 :

CREATE NONCLUSTERED INDEX NC_DataType_I_Alias 
    ON tblIdentifier(DataType) INCLUDE (Alias) 
7

당신이 * 선택, 시스템은 여전히 ​​전자를 얻기 위해 필요합니다 매우 열. 따라서 옵티마이 저는 클러스터 된 인덱스 스캔을 사용하는 것이 더 빠르다고 종종 결정할 것입니다 (클러스터 된 인덱스는 실제로 인덱스가 아닙니다 - 지정된 순서로 구성된 데이터 일뿐입니다). 책갈피 조회와 결합 된 다른 인덱스에서 찾기를 사용하는 것보다 기본 키를 기반으로 추가 행을 검색합니다.

따라서 클러스터되지 않은 인덱스 (실제로 클러스터되지 않은 인덱스는 클러스터 된 인덱스보다 성능이 우수하기 때문에 나쁜 이름 임)와 INCLUDE 인덱스의 추가 열은 covering이됩니다. SQL Server 2005 이전 버전의 경우 인덱스 끝 부분에 열을 추가하기 만하면됩니다.

기본적으로 기본 키는 좋지만 클러스터링 선택을 반드시 결정해야하는 것은 아니며 대부분 선택적인 작업에서 성능을 위해 일반적으로 비 클러스터형 인덱스 (적절한 경우 INCLUDE 열 포함)에 의존해야합니다. 가장 덜 선택적이고 가장 일반적으로 정렬 된 경우를 위해 클러스터 된 인덱스가 설계되었습니다.

+0

+1 좋은 설명을 위해 –

+0

동의, +1 또한 –

관련 문제