기본 키 대신 커버링 열이있는 고유 한 비 클러스터형 인덱스를 사용하는 의미


12

우리는 큰 테이블이 [MyTable]현재 모두를 가지고 Primary Key, 그리고Unique Non Clustered Index 같은 열에 ( [KeyColumn]). U NC 인덱스에는 추가 커버링 열이 있습니다.

동일한 열에 PK와 고유 NC 인덱스가 모두 중복 된 것으로 보이므로 기본 키를 삭제하는 대신 참조 무결성 목적으로 고유 비 클러스터형 인덱스를 사용하는 것을 고려하고있었습니다.

테이블은 다른 열에 의해 전체적으로 클러스터됩니다.

즉 우리는 :

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO

내가 아는 한 기본 키에 포함 열을 추가 할 수 없으므로 다음과 같이하십시오.

  • 에 의존하는 외래 키 제약 조건 제거 MyTable.KeyColumn
  • 기본 키를 MyTable.KeyColumn완전히 삭제
  • 외래 키를 테이블에 다시 추가합니다 (예 : RI를 통해 시행 MyTable.KeyColumn)

내가 이것을 생각할 수있는 유일한 의미는 ERD 다이어그램에서 시각적 키 기호를 얻지 못하고 포함 된 열 때문에 (잎) 인덱스 밀도가 적다는 것입니다.

/programming/487314/primary-key-or-unique-index를 읽었 으며이 작업 의 무결성 및 성능 측면에 만족합니다.

내 질문은 :이 접근 방식에 결함이 있습니까?

내가 달성하려는 것을 편집하십시오 : 성능 최적화 및 스프링 청소 . PK 또는 인덱스를 제거하면 인덱스에 필요한 페이지 수가 줄어 듭니다. 쓰기 속도가 빠를뿐 아니라 유지 관리 / 운영상의 이점도 있습니다.

이에 대한 배경 지식을 얻기 위해 PK없이 참조되는 테이블을 본 적이 없습니다. 그러나 열을 덮고있는 NC 인덱스가 테이블에 추가되었다는 사실은 내 생각을 조정해야한다는 것을 의미합니다.


당신이 성취하려는 것에 대해 말씀해 주시겠습니까? 또한 결국 클러스터형 인덱스로 끝나야합니다.

@ jn29098-업데이트되었습니다. PK가 아니고 커버링 열이 아닌 열에 클러스터형 인덱스가 있음을 확인 했으므로이 결정과 관련이없는 것 같습니다.
StuartLC

1
PK가 사라 졌을 때 방해 할 도구 / ORM / 데이터 생성 모델링 도구가 없습니까?
레무스 루사

유일한 단점은 일단 PK가 사라지면 키 열에 대해 하나의 인덱스 만 있고 PK 인덱스를 사용하는 쿼리는 키 열에 대한 인덱스 스캔 또는 키 열에 의한 순서를 말하고 Uniuqe 인덱스에 포함되지 않은 일부 여분의 IO를 클럭 할 수 있다는 것입니다 독특한 인덱스 리프 페이지는 PK의 페이지보다 훨씬 더 많기 때문에 그렇지 않으면 괜찮아 보이지만 일부 순수 주의자는 PK가 있어야한다고 말할 것입니다.
Gulli Meel

1
인덱스 사용 통계 DMV를 사용하여 해당 인덱스의 유용성을 확인하고 일부 쿼리에서 사용하고 있는지 확인하는 것이 좋습니다. 독특한 키 인덱스와 비교하여 확인한 다음 해당 쿼리를 사용하여 쿼리에 어떤 일이 발생할지 파악하십시오. 인덱스 ..
GULLI Meel

답변:


3

성능 최적화. PK 또는 인덱스를 제거하면 인덱스에 필요한 페이지 수가 줄어 듭니다. 쓰기 속도가 빠를뿐만 아니라 유지 관리 / 운영상의 이점도 있습니다 (예 : 조각 모음을 유지하기위한 인덱스 하나 감소 등).

제안 된 내용이 실제로 도움이 될 것임을 증명할 수 있어야합니다 (비용 대비 이익). 어떤 이유로이 변경이 고려됩니까? 이 테이블에 실제로 성능 문제가 있습니까, 아니면 "잘못된 것"입니까?

다음은 환경에 가장 적합한 결정을 내리는 데 도움이되는 몇 가지 다른 질문입니다.

  • 유지 관리 기간에 얼마나 많은 시간이 절약됩니까? 백업 창에서?

  • 저장 공간 (데이터 파일, 로그 파일, 백업 등)이 얼마나됩니까?

  • INSERT이 테이블에 성능은 정말 병목 지금? 얼마나 향상 될까요? 색인을 제거하는 것이 그 문제를 해결하기위한 최선의 전략입니까?

  • 이로 인해 각 테이블에 고유 인덱스뿐만 아니라 기본 키가있는 데이터베이스 도구 및 프레임 워크 (특히 ORM)에 문제가 발생합니까? 트랜잭션 복제 에는 게시 된 테이블에 기본 키 가 필요 합니다.

  • 자체 문서화 데이터베이스 스키마가 중요합니까?

  • 제한된 사용에도 불구하고 기본 키 인덱스의 범위가 좁아도 옵티마이 저가 특정 쿼리에 대해보다 효율적인 계획을 생성 할 수 있습니까? ( sys.dm_db_index_usage_stats찾을 때 사용하십시오 .)

개인적으로 말하면, (a) 여분의 색인이 문제이고, (b) 그것을 제거하는 것이 해결책이라는 것을 증명할 수있을 때까지는 그대로 두겠습니다.


감사합니다-인덱스 통계에 따르면 PK가 여전히 스캔에 많이 사용 된 것으로 나타났습니다. PK를 유지함으로써 얻을 수있는 가독성 / 컨벤션 이점은 장기적으로 스토리지에 미치는 영향보다 중요합니다. 트랜잭션 복제에 대한 요점은이를 해결합니다.이 데이터베이스를 곧 복제해야합니다.
StuartLC

2

해당 테이블에서 유일하게 (그리고 약간만 더 나쁘게) 수행되는 쿼리 유형은 KeyColumn 값 범위를 요청하는 쿼리 유형입니다. 현재 해당 쿼리는 PK 전체에서 인덱스 검색을 통해 가장 잘 제공됩니다.

이 테이블을 참조하는 테이블에 대한 참조 무결성 검사 비용은 더 높을 것입니다 (다소 약간 더 높음).

nullable 측면을 처리하는 한 인덱스 하나만으로도 충분합니다.

그것이 내 DB라면 아마도 단일 고유 인덱스로 갈 것입니다. 다른 모든 것은 동일합니다.


감사합니다-참조 링크가 있습니까? wrt는 조금 더 나쁘다. 당신은 취재 지수에서 낮은 지수 밀도만을 언급하고 있습니까, 아니면 이것을 유발할 다른 것이 있습니까?
StuartLC

불행히도 많은 경험에서 비롯된 것입니다. 몇 년 동안 저보다 훨씬 똑똑한 사람들과 채팅을했습니다! 그리고 그렇습니다. 정확히 말하자면 페이지 당 줄이 적을수록 더 많은 I / O가됩니다. 그러나 INCLUDE 열은 리프 수준에만 존재한다는 점에 주목할 가치가 있습니다. 다 나쁜 것은 아닙니다. 귀하의 질문에 대한 세부 사항을 기반으로 알고 있지만 다른 독자는 그렇지 않을 것으로 생각합니다.
매트 위트 필드

-2

내가 아는 한 기본 키에 포함 열을 추가 할 수는 없습니다.

KeyColumn에 클러스터형 인덱스가있는 경우 클러스터형 인덱스이므로 다른 모든 열은 암시 적으로 '덮어집니다'. 따라서 KeyColumn에 다른 인덱스를 추가하여 아무것도 얻지 못합니다. 실제로 인서트 속도를 늦추고 더 많은 공간을 사용합니다.

클러스터 된 인덱스는 인덱스가 아니기 때문에 인덱스 순서대로 테이블의 행을 저장하는 명령 일뿐입니다. 그리고 기본 키로 행을 fou 으면 다른 모든 열이 있습니다.


2
첫 번째 단락에서 :The table is clustered by another column entirely.
JNK

5
여기에 주요 키 / 클러스터형 인덱스 혼란이있을 수 있다고 생각합니다. 설득하려는 관리 스튜디오의 최선의 노력에도 불구하고 그들은 같은 것이 아닙니다.
매트 위트 필드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.