2013-06-08 6 views
1

5 개의 키 (열)에 클러스터 된 인덱스가 있습니다. 2 열에 클러스터되지 않은 색인이 있습니다. 한 번에 2 ~ 3 백만 행을 삽입하기 때문에 클러스터되지 않은 인덱스 2 개를 클러스터 된 인덱스로 변경하고 클러스터 된 5 개 인덱스를 5 개 클러스터되지 않은 인덱스로 변경했습니다. 내 질문.클러스터 및 비 클러스터 인덱스 큰 데이터 삽입

  1. (기본적으로 삭제하고 clustered로 인덱스를 재) 클러스터 된 인덱스, 나는이 클러스터 된 바로 이후 include (모든 열)이 필요하지 않습니다을 할 때?

  2. 적은 수의 열 인덱스를 클러스터로 전환하고 대형 열 클러스터 된 인덱스를 클러스터되지 않은 것으로 변경하는 것이 일반적입니까? 즉, 클러스터 된 인덱스는 간단하고 작아야합니다.

  3. 이 두 인덱스를 전환하면 성능 문제가 있습니까?

답변

0

링크 테이블이 아니라면 일반적으로 1 개의 열에 클러스터 된 인덱스가 있습니다. 일반적으로 권장되는 방법은 클러스터 된 인덱스 열에 대해 가능한 가장 작은 유형을 선택하는 것입니다. 많은 열이 있어야만 크기가 커집니다 (). 클러스터되지 않은 각 인덱스는 클러스터 된 인덱스 [클러스터 된 인덱스 포함]!의 값을 저장하지만, 외부 분할 및 성능 저하의 가능성도 크게 증가합니다 (inserts). 따라서 귀하의 질문에 대한 답변입니다.

맞습니다
  1. , 클러스터 된 인덱스가 테이블이며, 필요는 열 난 당신이 자체 또는 갖는 성능에 미치는 영향의 스위칭 성능에 대한 요구하고 만약에 확실하지 않다
  2. 절대적으로
  3. 예,
  4. 을 포함 없습니다 작은 (또는 더 적은 수의) 클러스터 된 인덱스가 있으므로, 두 가지 모두에 대답하려고 노력할 것입니다.
    • 자체 전환 중. 클러스터 된 인덱스를 클러스터되지 않은 것으로 전환하면 비용이 많이 들지 않아야한다고 생각합니다. 엔진이 실제로 힙을 만들기 위해 블록과 익스텐트를 뒤섞을 것이라고 생각하지 않습니다. 확실히 IAM은 시간이 걸릴 변경해야합니다. 비 클러스터형 인덱스를 클러스터 형으로 변경하면 훨씬 더 많은 작업이 수행됩니다. 클러스터 된 인덱스 키에 따라 데이터를 이동하는 것 외에도 SQLServer는 클러스터되지 않은 모든 인덱스를 업데이트해야합니다.
    • 더 많은 영향 (꽤 큰 주제, 나는 매우 짧은 대답을했다.) ... 클러스터 된 인덱스가 작을수록 다른 모든 인덱스를 저장하는 데 필요한 공간이 줄어들어 엔진에 더 빨리 액세스하고 엔진에서 리소스를 덜 소비한다는 것을 의미합니다. 업데이트

은 내가 클러스터되지 않은 인덱스에 클러스터 된 인덱스의 포함에 대해 상당히 모호한 성명을 발표했다 (그 지적에 대한 아론 버트 랜드 덕분에) 깨달았다. 절대적으로 정확하려면 각 클러스터되지 않은 인덱스에는 행을 가리키는 행 로케이터가 포함됩니다. 테이블이 클러스터 된 경우 행 위치 지정자가 클러스터 된 인덱스 키입니다. More info regarding clustered indexes.

+0

+1 당신이 암시했지만 더 명확히하기 위해 클러스터링 키는 모든 비 클러스터형 인덱스에 포함됩니다 ... 더 넓어 질수록 비 클러스터형 인덱스가 더 넓어집니다. –

+0

@Aaron Bertrand : 감사합니다. 나는 더 많은 관심을 끌기 위해 그것을 대담하게 만들 것입니다. – a1ex07

+0

네, 제 1 단락에서 보았습니다. 어떻게 든 그걸 놓쳤습니다. 마지막 탄환에서만 막연하게 참조되었다고 생각했습니다. –

관련 문제