데이터베이스에 부모 자식 관계 인 테이블이 여러 개 있습니다. 예를 들면 :클러스터되지 않은 외래 키 인덱스 권장 사항
CREATE TABLE [dbo].[cntnr_header]
(
[cntnr_id] [dbo].[uid] NOT NULL,
CONSTRAINT [pk_cntnr_header] PRIMARY KEY CLUSTERED ([cntnr_id] ASC),
);
CREATE TABLE [dbo].[cntnr_content]
(
[cntnr_content_id] [dbo].[uid] NOT NULL,
[cntnr_id] [dbo].[uid] NOT NULL,
CONSTRAINT [pk_cntnr_content]
PRIMARY KEY CLUSTERED ([cntnr_content_id] ASC),
CONSTRAINT [fk_cntnr_content_cntnr_header]
FOREIGN KEY ([cntnr_id])
REFERENCES [dbo].[cntnr_header] ([cntnr_id]),
);
현재 당신이 테이블 cntnr_content
에서 외래 키 cntnr_id
에 인덱스가없는 볼 수 있습니다. 튜닝 마법사를 실행하고 실제로및 cntnr_id
테이블에 cntnr_content
에 클러스터되지 않은 인덱스를 추가하는 것이 좋습니다. cntnr_content_id
이 이미 클러스터 된 인덱스이기 때문에 나는 이것을 이해하지 못합니다. 왜 이런 지수를 추천할까요?
CREATE NONCLUSTERED INDEX [_dta_index_cntnr_content_7_821577965__K1_K2] ON [dbo].[cntnr_content]
(
[cntnr_content_id] ASC,
[cntnr_id] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
나는 아마이 표에 불과 cntnr_id
에 비 클러스터형 인덱스를 추가해야한다고 생각합니다.
이 시나리오에 권장되는 방법이 있습니까? 나는 항상 이와 같은 관계로 특정 인덱스를 추가해야합니까?
많은 쿼리는 cntnr_id
에이 두 테이블을 함께 결합하거나 cntnr_id
을 지정하여 cntnr_content
에서 선택을 수행합니다. 이것은 또한 업데이트/삭제 무거운 테이블입니다. 업데이트 및 삭제는 항상 기본 키 (cntnr_content_id
)에서 수행됩니다.
외래 키에 대한 색인이 유용 할 수 있지만 "항상"및 "절대로"와 같은 용어 사용에 대해서는 매우주의해야합니다. 이 유형의 경우에는 테이블 자체의 구조 나 테이블 간의 관계가 아니라 데이터 쿼리 방법에 따라 크게 달라집니다. –
@AaronBertrand 일반적으로이 테이블의 쿼리 방법에 대해 설명하는 몇 가지 추가 정보가 추가되었지만 튜닝 관리자가 두 열 모두에서 클러스터되지 않은 인덱스를 제안하는 이유가 궁금합니다. –
질문에 "이 시나리오에서이 외래 키의 인덱스가 유용할까요?" 대답은 "아마도 그렇습니다." 테스트가 필요합니다.질문이 "모든 외래 키의 인덱스가 항상 유용할까요?" 내 대답은 아니오 야. –