여러 인덱스와 여러 열 인덱스


645

방금 SQL Server 2005의 테이블에 인덱스를 추가하고 있었고 생각했습니다. 색인을 생성하려는 열 당 1 개의 색인을 갖는 것보다 1 개의 색인을 생성하고 여러 열을 정의하는 것의 차이점은 무엇입니까?

하나를 다른 하나보다 사용해야하는 이유가 있습니까?

예를 들어

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

답변:


319

나는 Cade Roux에 동의합니다 .

이 기사는 올바른 길로 안내합니다.

한 가지 주목할 점은 클러스터형 인덱스에는 첫 번째 열로 고유 키 (권장 ID 열)가 있어야합니다. 기본적으로 인덱스 끝에 데이터를 삽입하는 데 도움이되며 많은 디스크 IO 및 페이지 분할이 발생하지 않습니다.

두 번째로, 데이터에 다른 인덱스를 작성하고 영리하게 구성되면 재사용됩니다.

예를 들어 세 개의 열에서 테이블을 검색한다고 가정

주, 카운티, 우편 번호.

  • 때로는 주별로 만 검색합니다.
  • 때때로 주와 카운티별로 검색합니다.
  • 당신은 자주 주, 카운티, 우편으로 검색합니다.

그런 다음 상태, 카운티, 우편 번호가있는 색인. 이 세 가지 검색 모두에 사용됩니다.

zip만으로도 많이 검색하는 경우 zip은 해당 인덱스의 세 번째 부분이므로 쿼리 최적화 프로그램은 해당 인덱스를 유용한 것으로 간주하지 않으므로 SQL Server에서 위의 인덱스를 사용하지 않습니다.

그런 다음 Zip에만 인덱스를 만들어이 인스턴스에서 사용할 수 있습니다.

그런데 다중 열 인덱싱을 사용하면 첫 번째 인덱스 열을 항상 검색에 사용할 수 있다는 사실을 활용할 수 있습니다 있으며 '상태'로만 검색 할 때 효율적이지만 아직 '상태'의 단일 열 인덱스만큼 효율적이지 않다는 사실을 활용할 수 있습니다 '

나는 당신이 찾고있는 대답은 자주 사용하는 쿼리의 where 절과 그룹 기준에 달려 있다는 것입니다.

이 기사는 많은 도움이 될 것입니다. :-)


2
그렇다면 가장 좋은 방법은 각 열에 대한 개별 색인 외에도 주, 카운티 및 우편 번호에 대한 색인을 정의하는 것입니까?
Maxim Zaslavsky

12
@ jball 여기에 뭔가 빠졌습니까? 이 기사는 주로 SQL Server 버전 제한의 차이점에 관한 것 같습니다. 기사를 옮길 수 있습니까?
Ian R. O'Brien

@Ian 4 년 전부터 지금까지 원래 링크를 정렬 한 후 3 년 만에 뭔가 잃어버린 것처럼 보입니다. 블로그 게시물에 evilhomer가 링크 한 제목이 올바르다는 것을 알 수 있지만 시리즈의 후속 블로그는 더 이상 첫 번째 게시물에서 쉽게 찾을 수없는 것 같습니다. Kimberly의 블로그 아카이브를 둘러보고 시리즈의 다른 기사를 켤 수 있는지 확인해야합니다.
jball

1
1) "기본적으로 [IDENTITY 열이있는 클러스터형 인덱스]는 인덱스 끝에 데이터를 삽입하는 데 도움이됩니다". 다중 사용자 시스템에서는 "많은 디스크 IO 및 페이지 분할을 유발하지 않습니다"는 완전히 거짓입니다. 사실 다중 사용자 시스템에서 높은 경합 (낮은 동시성)을 보장 합니다. 2) 클러스터형 인덱스는 관계형 키 여야합니다. 하지IDENTITY, GUID, etc . 3) "그런 다음 주, 카운티, 우편 번호가있는 색인이이 세 가지 검색 모두에 사용됩니다." 거짓이며 "첫 번째 열을 사용할 수 있습니다"와 모순됩니다. 인덱스의 2nd & subs cols는 검색에 사용할 수 없습니다.
PerformanceDBA

82

예. 색인 생성에 대한 Kimberly Tripp의 기사 를 확인하는 것이 좋습니다. .

인덱스가 "커버링"인 경우 인덱스 이외의 것을 사용할 필요가 없습니다. SQL Server 2005에서는 키의 일부가 아닌 다른 열을 인덱스에 추가하여 나머지 행으로의 트립을 제거 할 수 있습니다.

하나의 열에 각각 여러 개의 인덱스가있는 경우 하나의 인덱스 만 사용된다는 의미 일 수 있습니다. 실행 계획을 참조하여 다양한 인덱스 구성표가 어떤 영향을 미치는지 확인해야합니다.

또한 튜닝 마법사를 사용하여 주어진 쿼리 또는 작업 부하가 가장 잘 수행되는 인덱스를 결정하는 데 도움이됩니다.


7
킴벌리 트립은 자신이 무엇을 말하는지 알고 있습니다. 나는 그녀의 이야기에 있었고 그녀는이 물건을 밖으로 알고 있습니다. 훌륭한 조언.
evilhomer

@CadeRoux 절은 관계 '&'의 2 열이 내 시간의 대부분은 둘 다에 그들에 멀티 컬럼 인덱스 또는 단일 열 인덱스가 더 좋을 경우
그것은 함정

2
@RachitGupta 두 열이 모두 포함 된 하나의 인덱스
Cade Roux

41

여러 열 인덱스는 모든 열을 참조 하는 쿼리에 사용할 수 있습니다 .

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

이것은 다중 열 인덱스를 사용하여 직접 조회 할 수 있습니다. 반면에 단일 열 인덱스 중 최대 하나를 사용할 수 있습니다 (Colum1 = 1 인 모든 레코드를 찾은 다음 각 열에서 Column2 및 Column3을 확인해야 함).


24
맞습니다. 그러나 이러한 열을 각각 단일 인덱스로 사용하면 작업 속도가 크게 향상됩니다. 일반적으로 열의 값 중 하나는 결과 집합을 너무 줄여 인덱스없이 나머지를 찾는 것이 중요하지 않으며 최적화 프로그램이이 값을 선택하는 데 능숙합니다.
TToni 2016 년

17

놓친 것으로 보이는 항목 중 하나는 별 변형입니다. 인덱스 교차 연산자는 사실 테이블에서 I / O가 수행되기 전에 각 술어에 의해 적중 된 행 세트를 계산하여 술어를 분석합니다. 스타 스키마에서는 각 개별 차원 키를 색인화하고 쿼리 최적화 프로그램은 색인 교차 계산으로 선택할 행을 분석 할 수 있습니다. 개별 열의 인덱스는이를위한 최고의 유연성을 제공합니다.


질문과 관련하여 (일반적인) 색인이 사용되는 방법에 대한 적절한 설명을 +1하십시오.
RobM

8

비교적 정적 인 열 집합을 자주 사용하는 쿼리가있는 경우이를 포함하는 단일 포함 인덱스를 만들면 성능이 크게 향상됩니다.

인덱스에 여러 열을 넣으면 옵티마이 저는 열이 인덱스에없는 경우에만 테이블에 직접 액세스해야합니다. 나는 데이터웨어 하우징에서 이것을 많이 사용합니다. 단점은 특히 데이터가 매우 변동적인 경우이 작업을 수행하면 많은 오버 헤드가 발생할 수 있다는 것입니다.

단일 열에 인덱스를 작성하면 OLTP 시스템에서 자주 찾는 조회 작업에 유용합니다.

열을 인덱싱하는 이유와 사용 방법을 스스로에게 문의해야합니다. 일부 쿼리 계획을 실행하고 언제 액세스되는지 확인하십시오. 인덱스 튜닝은 과학만큼이나 본능적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.