2013-12-20 2 views
0

ID1과 ID2에 비 클러스터형 인덱스 1이있는 테이블이이 순서대로 있습니다.SQL Server 다중 인덱스 순서 최적화

Select count(distinct(id1)) from table 

반환

1 Select count(distinct(id2)) from table은 테이블의 모든 값이 있습니다. 해당 테이블에

querys 내가 index1의의 필드의 순서를 전환 할 경우 어떤 성능 향상을 할 수

... where id1= XX and id2 = XX를 사용?

나는 그것이 더 좋을 지 모르지만 아마 : id1은 단지 1 개의 값을 갖고 있기 때문에 무관심한가요?

+1

질문이 명확하지 않습니다. 당신의 질의는'id', 당신의 인덱스와'where' 절은'id1'과'id2'를 가지고 있습니다. 조금 더 나은 질문을 표현할 수 있습니까? 샘플 데이터와 원하는 결과가 도움이됩니다. –

+0

죄송합니다. 이제는 맞습니다. – user2920607

답변

1

나는이 두 문장을 비교하고, 제대로 이해하고 대부분의 상황에서

where id1= XX and id2 = XX 

, 이것은 table(id1, id2) 또는 table(id2, id1)에 인덱스를 사용할 것이다. where (또는 on) 절의 비교 순서는 어떤 인덱스를 사용할 수 있는지에 영향을 미치지 않습니다.

고유 인덱스에 단일 값만있는 열을 포함해야하는지 여부는 다른 문제입니다. 더 복잡한 인덱스를 갖는 것에 약간의 성능 효과가 있습니다. 트리 구조는 각 키에 대해 더 많은 바이트를 저장해야합니다. 그러나 쿼리는 :

select count(distinct id2) 
from table 
where id1 = xx and idx = xx 

실제로 싱글 인덱스 table(id2)보다 복합 인덱스을 빠르게 실행됩니다.그 이유는 복합 색인을 사용하여 쿼리를 완전히 만족시킬 수 있기 때문입니다 (전문 용어에서는 "쿼리의 커버 인덱스"입니다). 싱글 톤 인덱스는 테이블 데이터에서 id1의 값을 검색해야하므로 추가 처리가 필요합니다.

+0

즉,이 정확한 경우 색인 열의 순서에 관계없이 복합 색인을 사용하지 않거나 단일 색인을 사용하는 것 사이에 약간의 성능 개선 만있을 것입니다 id1의 모든 값이 동일하기 때문에? – user2920607

+0

@ user2920607 . . 대부분의 경우 색인을 사용하면 색인을 사용하지 않는 것보다 성능이 향상됩니다. 싱글 톤은 테이블 데이터에서 값을 찾아야합니다. 컴포지트가 쿼리를 처리하고 추가 처리가 필요하지 않습니다. 합성물은 아마 약간 더 나은 성능을 가지고있을 것입니다. –

0

색인과 관련된 항목을 정의하는 순서입니다. 열 ID1에 항상 1 개의 값만있는 경우 비 클러스터형 색인의 Covering Index에서 사용하지 않는 한 색인에 넣을 필요가 없습니다 (즉, 표 자체의 물리적 순서가 아니라 색인을 의미 함)). 일반적으로 색인에 정의 된 첫 번째 열은 검색해야하는 가장 다양한 값이있는 열이어야합니다. 이렇게하면 1 백만 행의 표가 있고 색인의 첫 번째 열에는 1 (또는 소수)의 다양한 값만있는 경우이 방법으로 시각화하면 1 백만 개 중에서 원하는 행을 찾는데 도움이됩니다. ? 또는 ID2를 먼저 검색하는 것이 더 효율적이며 검색에 더 효율적이며 더 자주 사용되는 것은 자신에게 물어 보는 것입니다. 아래는 귀하의 질문에 대한 더 많은 정보입니다.

SQL Server Clustered Index - Order of Index Question

당신이 클러스터되지 않은 인덱스를 사용하는 경우, 당신의 색인에서 첫 번째 열이 모두 같은 값 인 경우 다른하지 나타날 수 있습니다. 그러나 문제가되는 이유는 Non-Clustered Index가 여러 페이지에 저장되기 때문입니다. 페이지에 저장할 수있는 항목이 많을수록 더 빨리 검색 할 수 있습니다. 검색에 값을 추가하지 않는 페이지에 열을 포함하면 동일한 인덱스가 더 많은 페이지를 확장해야합니다. 더 많은 페이지 뒤집기 및 더 긴 조회를 의미합니다. 또한 인덱스가 업데이트 될 때 삽입 도중 기존 페이지에 새 항목을 추가 할 공간이 적어 더 많은 페이지 분할이 발생합니다. 따라서 색인에 단 하나의 값만있는 열을 추가하려는 결정에 부작용이 있습니다. 열을 사용하여 공통 선택에서 검색된 값을 "덮어 쓰는"경우 인덱스에 포함 된 열을 사용할 수도 있습니다.이 열은 인덱스를 재정렬하지 않고 추가로 적용 할 수있는 인덱스처럼 작동합니다. 그것이 원래 1 개의 값만을 가진 Column을 추가하기위한 의도 된 목적 이었다면.

+0

"일반적으로 색인에 정의 된 첫 번째 열은 검색해야하는 가장 다양한 값이있는 열이어야합니다." 나는 이것을 알고 있었지만이 정확한 경우 id1의 모든 값이 동일하고 색인 비 클러스터 된, 어쩌면 그것은 아무런 차이가 없다는 것을 확신한다. querys는 "업데이트 필드 1 ... 여기서 id1 = XX 및 id2 = XX" – user2920607

+0

차이점은 클러스터되지 않은 각 페이지에서 사용할 수있는 공간을 줄입니다. 색인. 이는 상황에 따라 약간의 차이가있을 수 있습니다. 인덱스에서 열을 검색 목적이 아닌 "커버 된 인덱스 값"으로 사용하는 경우 인덱스에 포함 된 열을 대신 사용할 수 있습니다. – CodeCowboyOrg

+0

업데이트 된 값이 인덱스 정의에 포함 된 값이 아니기 때문에 필자의 경우이 인덱스는 커버 된 인덱스가 아닙니다. 요약하면, 제 경우 엔 인덱스가 정상적으로 작동하지만 각 페이지마다 조금 더 많은 공간을 사용합니다. 스피드 성능에 대해 걱정하고 있으며 인덱스 순서를 변경해도 큰 차이는 없습니다. 도와 주셔서 감사하고 내가 틀렸다면 수정 해주세요. – user2920607