[sql-server] 여러 인덱스와 여러 열 인덱스

방금 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)



답변

나는 Cade Roux에 동의합니다 .

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

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

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

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

주, 카운티, 우편 번호.

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

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

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

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

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

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

이 기사는 많은 도움이 될 것입니다. 🙂


답변

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

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

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

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


답변

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

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

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


답변

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


답변

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

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

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

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


답변