문제

다음 SQL 문은 Table1.Table1Column에 인덱스를 자동으로 생성합니까, 아니면 명시적으로 생성해야 합니까?

데이터베이스 엔진은 SQL Server 2000입니다.

       CREATE TABLE [Table1] (
. . .
            CONSTRAINT [FK_Table1_Table2] FOREIGN KEY 
            (
                [Table1Column]
            ) REFERENCES [Table2] (
                [Table2ID]
            )

        )
도움이 되었습니까?

해결책

SQL Server는 외국 키에서 인덱스를 자동으로 생성하지 않습니다. 또한 MSDN에서 :

외국 키 제약 조건은 다른 테이블의 기본 키 제약 조건에만 연결될 필요가 없습니다. 또한 다른 테이블에서 고유 한 제약 조건의 열을 참조하도록 정의 할 수 있습니다. 외국 키 제약 조건은 널 값을 포함 할 수 있습니다. 그러나 복합 외부 키 제약 조건의 열에 null 값이 포함 된 경우, 외국 키 제약 조건을 구성하는 모든 값의 검증이 건너 뜁니다. 복합 외부 키 제약 조건의 모든 값이 검증되도록하려면 모든 참여 열에 null을 지정하지 마십시오.

다른 팁

Mike의 질문을 읽으면 FK 제약 조건이 FK가있는 테이블의 FK 열에서 인덱스를 생성 할 것인지 묻습니다 (표 1). 대답은 아니오이며 일반적으로입니다. (제약 조건의 목적 상),이 작업을 수행 할 필요가 없습니다. 반면에 제약 조건의 "대상"으로 정의 된 열은 참조 테이블의 고유 인덱스 여야합니다. 또는 대체 키. (고유 인덱스) 또는 작성 제약 조건 문서가 실패합니다.

(편집 : 아래 주석을 명시 적으로 처리하도록 추가 -) 구체적으로, 외국의 주요 제약 조건이있는 데이터 일관성을 제공 할 때. 인덱스는 FK 측에서 행 또는 행을 삭제하기 위해서만 DRI 제약 조건의 성능에 영향을 줄 수 있습니다. 제약 조건을 사용하는 경우 삽입 또는 업데이트 중에 프로세서는 FK 값을 알고 있으며 PK 측의 참조 테이블에 행이 있는지 확인해야합니다. 이미 인덱스가 있습니다. PK 측에서 행을 삭제할 때는 FK쪽에 행이 없는지 확인해야합니다. 이 경우 색인이 약간 도움이 될 수 있습니다. 그러나 이것은 일반적인 시나리오가 아닙니다.

그러나 그 외에는 특정 유형의 쿼리에서 쿼리 프로세서가 해당 외국 키 열을 사용하는 조인의 여러 측면에서 레코드를 찾아야합니다. 성능에 가입하십시오 ~이다 해당 외국 키에 색인이 존재하면 증가합니다. 그러나이 조건은 외국의 키 제약 조건이 존재하지 않는 조인 쿼리에서 FK 열을 사용하는 것에 특이 적입니다. 조인의 다른 쪽이 PK인지 다른 임의의 열인지 여부는 중요하지 않습니다. 또한 해당 FK 열을 기반으로 쿼리 결과를 필터링하거나 주문 해야하는 경우 색인이 도움이됩니다. 다시, 이것은 해당 열의 외래 키 제약과 관련이 없습니다.

아니요, 열에 외래 키를 생성해도 해당 열에 인덱스가 자동으로 생성되지는 않습니다.외래 키 열을 인덱싱하지 못하면 다음과 같은 상황에서 테이블 스캔이 발생합니다.

  • 참조된(상위) 테이블에서 레코드가 삭제될 때마다.
  • 두 테이블이 외래 키로 조인될 때마다.
  • FK 열이 업데이트될 때마다.

이 예시 스키마에서는 다음과 같습니다.

CREATE TABLE MasterOrder (
   MasterOrderID INT PRIMARY KEY)

CREATE TABLE OrderDetail(
   OrderDetailID INT,
   MasterOrderID INT  FOREIGN KEY REFERENCES MasterOrder(MasterOrderID)
)

MasterOrder 테이블에서 레코드가 삭제될 때마다 OrderDetail이 검색됩니다.OrderMaster 및 OrderDetail에 참여할 때마다 전체 OrderDetail 테이블도 검색됩니다.

   SELECT ..
   FROM 
      MasterOrder ord
      LEFT JOIN OrderDetail det
       ON det.MasterOrderID = ord.MasterOrderID
   WHERE ord.OrderMasterID = @OrderMasterID

일반적으로 외래 키를 인덱싱하지 않는 것은 규칙보다 훨씬 더 예외적입니다.

외래 키를 인덱싱하지 않는 경우는 외래 키가 전혀 활용되지 않는 경우입니다.이렇게 하면 서버를 유지 관리하는 오버헤드가 불필요해집니다.유형 테이블은 때때로 이 범주에 속할 수 있습니다. 예는 다음과 같습니다.

CREATE TABLE CarType (
   CarTypeID INT PRIMARY KEY,
   CarTypeName VARCHAR(25)
)

INSERT CarType .. VALUES(1,'SEDAN')
INSERT CarType .. VALUES(2,'COUP')
INSERT CarType .. VALUES(3,'CONVERTABLE')

CREATE TABLE CarInventory (
   CarInventoryID INT,
   CarTypeID INT  FOREIGN KEY REFERENCES CarType(CarTypeID)
)

CarType.CarTypeID 필드가 업데이트되지 않고 레코드 삭제가 거의 발생하지 않는다는 일반적인 가정을 하면 CarInventory가 CarTypeID로 검색되지 않은 경우 CarInventory.CarTypeID에 대한 인덱스를 유지 관리하는 서버 오버헤드가 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top