복붙노트

[SQL] 클러스터 된 인덱스가 고유해야합니까?

SQL

클러스터 된 인덱스가 고유해야합니까?

클러스터 된 인덱스가 고유하지 않으면 어떻게됩니까? 삽입 된 행이 어떤 종류의 "오버 플로우"페이지로 흘러 때문에 나쁜 성과로 이어질 수 있습니까?

이 독특한 "만든"어떻게 그렇게하면됩니까? 이 특별하게 만드는 가장 좋은 방법은 무엇입니까?

나는 현재 논리적 인 부분으로 내 테이블을 분할하는 클러스터 된 인덱스를 사용하고 있기 때문에 나는 해달라고 부탁하지만, 성능은 그렇고 그런, 그리고 최근에 내 클러스터 된 인덱스가 고유하게 조언을 얻었다. 그에 두 번째 의견을 싶습니다.

감사!

해결법

  1. ==============================

    1.그들은 고유하지 않지만 그것은 확실히 권장합니다. 나는 고유하지 않은 컬럼에 CI를 만들고 싶었 어디 아직 시나리오가 발생하지 않았습니다.

    그들은 고유하지 않지만 그것은 확실히 권장합니다. 나는 고유하지 않은 컬럼에 CI를 만들고 싶었 어디 아직 시나리오가 발생하지 않았습니다.

    당신이 고유하지 않은 컬럼에 CI를 작성하면 어떻게됩니까

    나쁜 성능이 리드를합니까?

    uniqueifier를 추가 확실히 계산하고 저장에 약간의 오버 헤드를 추가한다. 이러한 오버 헤드가있을 경우 눈에 띄는 여러 가지 요인에 따라 달라집니다.

    편집하다 의견 레무스에 의해 지적 된 바와 같이, 고유하지 않은 CI를 작성하는 것이 합리적인 선택이 될 것입니다 존재의 사용 사례가 않습니다. 나 그 시나리오 오프 하나가 단순히 노출 또는 능력 (당신의 선택을 선택) 내 자신의 부족을 보여줍니다 발생하는 데 없습니다.

  2. ==============================

    2.나는 인덱싱의 여왕, 킴벌리 트립, 주제에 무슨 얘기 체크 아웃 같은 :

    나는 인덱싱의 여왕, 킴벌리 트립, 주제에 무슨 얘기 체크 아웃 같은 :

    나는 클러스터링 키에 대한 내 추천과 함께 시작하는거야 - 몇 가지 이유. 첫째, 만들기 쉬운 결정이고 둘째,이 결정을 조기 사전에 조각의 일부 유형을 방지하는 데 도움이됩니다. 당신이 기본 테이블 조각의 특정 유형을 방지 할 수 있습니다 경우에 당신은 당신의 테이블이 오프라인으로 할 것을 요구 (일부 SQL 서버 2000 및 이하, SQL 서버 2005, 그 중) 일부 유지 보수 활동을 최소화 할 수 있습니다. OK, 나는 나중에 다시 물건을 얻을 것이다 .....

    내가 클러스터링 키를 찾아 그 주요 사항과하자의 시작 :

    * Unique
    * Narrow
    * Static
    

    왜 독특한? 클러스터링 키 (있는 경우) 모든 비 클러스터형 인덱스에서 조회 키로 사용되기 때문에 클러스터링 키는 고유해야합니다. 책의 뒤쪽에, 예를 들어 인덱스를 타고 - 인덱스 항목이 당신이 찾고있는 하나가 될 것이다, 해당 항목 (색인 항목), 그렇지 않으면 고유해야합니다 - 당신에 대한 색인 엔트리 포인트가되는 데이터를 찾을해야하는 경우 ? 당신은 클러스터 된 인덱스를 만들 때, - 그것은 고유해야합니다. 그러나, SQL Server는 클러스터링 키가 고유 컬럼에 생성되는 것을 필요로하지 않는다. 당신은 당신이 원하는 모든 열 (들)을 만들 수 있습니다. 클러스터링 키가 고유하지 않으면 내부적으로 다음 SQL Server는 "uniquify"을하여 데이터에 4 바이트 정수를 추가하는 것입니다. 클러스터 된 인덱스가 다음 고유하지 않은 일에 생성 된 경우 그래서뿐만 아니라 추가,이 낭비되는 것 인덱스 생성시 오버 헤드 디스크 공간, 삽입하고 업데이트를 추가 비용이있다, 그리고 SQL 서버 2000, 클러스터 된 인덱스에 추가 비용이있다 (때문에 클러스터링 키 가난한 선택의 지금 가능성이있는) 다시.

  3. ==============================

    3.그들은하지, 그들이하지 않으면 더 나은 어디 때가있다.

    그들은하지, 그들이하지 않으면 더 나은 어디 때가있다.

    A-반 임의의 고유 직원 ID와 테이블, 그리고 각 직원에 대한 DepartmentId을 고려하여 선택 사항이있는 경우

    SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%
    

    DepartmentId 그것은 고유 인덱스 아니다 (또는 특히 때문에) (성능에 가장 그것이 주어진 DepartmentId 내의 모든 레코드가 클러스터되는 것을 보장하기 때문에)에도 클러스터 된 인덱스 인 경우 다음 성능에 가장 좋습니다.

    말한다 예를 들어 클러스터 된 인덱스 디자인 지침이있다,

    예를 들어, "고유성의 높은 수준"의 나의 이해는 쿼리의 대부분이 주어진 도시 내에서 레코드를 선택하려는 경우 clusted 인덱스로 "나라"를 선택하는 것이 좋다되지 않는 것입니다.

  4. from https://stackoverflow.com/questions/4332982/do-clustered-indexes-have-to-be-unique by cc-by-sa and MIT license