[sql-server] 외래 키가 자동으로 인덱스를 생성합니까?

키 두 테이블을 외부 키로 사용하면 해당 SQL Server가 자식 테이블의 인덱스와 비슷한 것을 만들 것이라고 들었습니다. 나는 이것이 사실이라고 믿는 데 어려움을 겪지 만, 특별히 이것과 관련된 많은 것을 찾을 수는 없습니다.

이것을 묻는 나의 진짜 이유는 아마도 15 개의 관련 테이블이있는 테이블에 대해 delete 문에서 응답 시간이 매우 느리기 때문입니다. 데이터베이스 담당자에게 질문했는데 필드에 외래 키가 있으면 인덱스처럼 작동한다고 말합니다. 이것에 대한 당신의 경험은 무엇입니까? 모든 외래 키 필드에 인덱스를 추가해야합니까 아니면 불필요한 오버 헤드입니까?



답변

외래 키는 두 테이블 간의 관계인 제약 조건으로 인덱스 자체와는 아무런 관련이 없습니다.

그러나 FK 관계를 통해 관련 테이블을 조회하고 특정 행을 추출해야하기 때문에 외래 키 관계의 일부인 모든 열을 인덱싱하는 것이 의미가 있다는 것은 알려진 사실입니다. 단일 값 또는 값 범위

따라서 FK와 관련된 모든 열을 인덱싱하는 것이 좋지만 FK 자체는 인덱스가 아닙니다.

Kimberly Tripp의 훌륭한 기사 “SQL Server가 언제 외래 키 열에 인덱스를 추가하지 않았습니까?”를 확인하십시오. .


답변

와우, 답은지도 전체에 있습니다. 따라서 설명서 는 다음과 같이 말합니다.

FOREIGN KEY 제약 조건은 다음과 같은 이유로 인덱스 후보입니다.

  • PRIMARY KEY 제약 조건의 변경 사항은 관련 테이블의 FOREIGN KEY 제약 조건으로 확인합니다.

  • 외래 키 열은 한 테이블의 FOREIGN KEY 제약 조건의 열과 다른 테이블의 기본 또는 고유 키 열을 일치시켜 관련 테이블의 데이터를 쿼리에 결합 할 때 조인 조건에서 종종 사용됩니다. 인덱스를 사용하면 Microsoft® SQL Server ™ 2000이 외래 키 테이블에서 관련 데이터를 빠르게 찾을 수 있습니다. 그러나이 인덱스를 생성 할 필요는 없습니다. 테이블간에 PRIMARY KEY 또는 FOREIGN KEY 제약 조건이 정의되지 않은 경우에도 두 개의 관련 테이블의 데이터를 결합 할 수 있지만 두 테이블 간의 외래 키 관계는 키를 사용하는 쿼리에서 두 테이블이 결합되도록 최적화되었음을 나타냅니다. 그 기준.

따라서 실제로는 색인을 생성하지 않는다는 것이 상당히 명확 해 보입니다 (문서는 약간 혼잡하지만).


답변

아니요, 외래 키 필드에 대한 암시 적 인덱스가 없습니다. 그렇지 않으면 Microsoft가 “외래 키에 인덱스를 만드는 것이 종종 유용합니다” 라고 말하는 이유는 무엇입니까 ? 기본 키 – 당신의 동료는 언급-에 테이블의 기본 키를 사용하여 참조 테이블의 외래 키 필드를 혼동 할 수 않는 암시 적 인덱스를 만들 수 있습니다.


답변

SQL Server는 기본 키에 대한 인덱스를 자동으로 생성하지만 외래 키에 대한 인덱스는 자동으로 생성하지 않습니다. 외래 키에 대한 인덱스를 만듭니다. 아마도 오버 헤드의 가치가 있습니다.


답변

주문이라는 큰 테이블과 고객이라는 작은 테이블이 있다고 가정하십시오. 주문에서 고객까지 외래 키가 있습니다. 이제 고객을 삭제하면 Sql Server는 고아 주문이 없는지 확인해야합니다. 있으면 오류가 발생합니다.

주문이 있는지 확인하기 위해 Sql Server는 대량 주문 테이블을 검색해야합니다. 색인이 있으면 검색이 빠릅니다. 없으면 검색 속도가 느려집니다.

따라서이 경우 느린 삭제는 인덱스가없는 것으로 설명 할 수 있습니다. 특히 Sql Server가 인덱스없이 15 개의 큰 테이블을 검색해야하는 경우.

PS 외래 키에 ON DELETE CASCADE가있는 경우 Sql Server는 여전히 주문 테이블을 검색해야하지만 삭제 된 고객을 참조하는 주문을 제거해야합니다.


답변

외래 키는 인덱스를 만들지 않습니다. 대체 키 제약 조건 (UNIQUE)과 기본 키 제약 조건 만 인덱스를 만듭니다. 이것은 Oracle 및 SQL Server에서 마찬가지입니다.


답변

내 지식이 아닙니다. 외래 키는 자식 키의 값이 부모 열의 어딘가에 표시되어야한다는 제약 조건 만 추가합니다. 자식 키도 인덱싱해야하며 제한되어야한다고 데이터베이스에 알리지 않습니다.