10

일반적으로 클러스터 된 인덱스는 PK-> 클러스터 된 인덱스 (Meaning of Primary Key to Microsoft SQL Server 2008)에 대한 최근 질문에서 PK 및 클러스터 된 인덱스를 동일하게 설정하지 않아도되지만 기본 키를 설정하여 SQL Server Management Studio에서 만들어집니다.SQL Server에서 클러스터 된 인덱스를 선택하는 방법은 무엇입니까?

그러면 클러스터형 인덱스를 어떻게 선택해야합니까? 의 다음과 같은 예를 보자 :

테이블 고객을 생성 (ID의 지능, ...) 테이블 주문 (아이디 INT, CustomerID를의 int)를

우리는 일반적으로 ID 열하지만 난 모두에서 PK/CI를 만들 것를 만들 CustomerID의 Orders에 대한 생성을 고려했습니다. 그게 최선의 선택입니까?

+0

가능한 [SQL Server - 클러스터되지 않은 인덱스와 비 클러스터형 인덱스를 사용하는 경우] (https://stackoverflow.com/questions/18304376/sql-server-when-to-use-clustered-vs-non- clustered-index) –

답변

11

그녀가 클러스터 된 인덱스에 대한 모습은 주로 :

  • 고유
  • 좁은
  • 정적

그리고 경우 당신은 또한 보장 할 수 있습니다 :

  • 패턴 계속 증가

는 당신은 당신의 이상적인 클러스터링 키를 가진 꽤 가까이있어!

그녀의 전체 blog post here을 확인하고 테이블 작업에 대한 주요 영향 클러스터링에 대한 또 다른 흥미로운 내용을 여기에서 확인하십시오. The Clustered Index Debate Continues.

INT (특히 INT ID) 또는 INT 및 DATETIME과 같은 것은 이상적인 후보자입니다. 다른 이유로 GUID는 전혀 좋지 않습니다. 따라서 GUID를 PK로 가질 수는 있지만 테이블을 클러스터링하지 마십시오. 인식을 넘어 조각화되어 성능에 어려움이 있습니다.

+0

이 블로그 게시물은 새로운 버전의 SQL Server와 관련이 있습니까? 아니면 SQL Server 2008의 최신 성능 조정을 통해 나중에 모범 사례가 변경 되었습니까? –

+0

@AdrianGrigore : "정상적인"표 (예 : datawarehouse/columnstore 자료가 아님)를 사용하는 한 모든 것이 여전히 유효합니다. –

+0

감사합니다. :) –

1

클러스터링이 염려되는 경우 일반적으로 데이터 검색을 향상시키는 데 도움이됩니다. 예를 들어, 주어진 고객에 대한 모든 레코드를 한꺼번에 원할 것입니다. 고객 ID를 클러스터링하면 파일의 여러 페이지에 흩어져있는 것이 아니라 동일한 물리적 페이지에 해당 행이 보관됩니다.

ROT : 컬렉션을 표시하려는 클러스터. 구매 오더의 품목은 전형적인 예입니다.

+0

PO의 광고 항목은 클러스터에 적합하지만 일반적인 광고 주문에 2 ~ 3 개 (또는 12 개)의 광고 항목이없는 경우에는 적합하지 않습니다. 클러스터링중인 행이 수십 또는 수백 개가되기 시작하지 않으면 SQL Server에서 책갈피 찾아보기를 수행하는 것이 좋습니다. 나는 비즈니스 요구 사항이 특정 출납원의 이동 중에 발생하는 모든 "라인 항목"을 찾아야 만하는 시스템을 가졌습니다 (균형이 맞는지 확인하기 위해). ** Shift ** 및 ** Shift **에서 클러스터링하는 경우 "id"로 "라인 항목"을 비정규 화하는 것은 엄청난 속도 향상이었습니다. –

6

CLUSTERED 색인의 가장 적합한 후보자는 레코드를 가장 자주 참조 할 때 사용하는 키입니다.

일반적으로 검색 및/또는 FOREIGN KEY 관계에 사용되는 내용이므로 PRIMARY KEY입니다.

경우에 따라 Orders.ID이 검색 및 참조에 참여하므로 클러스터링 표현식에 가장 적합 할 수 있습니다. 당신이 Orders.CustomerIDCLUSTERED 인덱스를 작성하는 경우

, 다음과 같은 일이 발생합니다

  1. CustomerID하는 것은 고유하지 않습니다. 고유성을 보장하기 위해 uniquifier이라는 특별한 숨겨진 32-bit 열이 각 레코드에 추가됩니다.

  2. 표의 레코드는이 열 쌍 (CustomerID, uniquifier)에 따라 저장됩니다.

  3. Order.ID의 보조 인덱스가 만들어지고 (CustomerID, uniquifier)이 레코드 포인터로 사용됩니다. 이 같은

  4. 쿼리 : 모든 열 ID에 인덱스에 저장되기 때문에

    SELECT * 
    FROM Orders 
    WHERE ID = 1234567 
    

    는, 외부 조작하는 Clustered Seek을해야 할 것입니다. 모든 열을 검색하려면 먼저 레코드가 클러스터 된 테이블에 있어야합니다.

이 추가 작업은 IndexDepth 많은 페이지는 간단한 Clustered Seek로 읽는 필요 테이블의 레코드의 총 수의 IndexDepth beign O(log(n)).킴벌리 트립 - - 인덱싱의 여왕 에 따르면

관련 문제