Oracle에서 외래 키에 대한 인덱스를 만들어야합니까?


120

나는 테이블 A과 테이블이 B있습니다. 의 기본 키 에 A대한 외래 키가 있습니다.BBB_ID

어떤 이유로 (합법적 인 이유가 있음을 알고 있습니다) 키에서이 두 테이블을 조인 할 때 인덱스를 사용하지 않습니다.

인덱스를 별도로 생성 A.B_ID해야합니까, 아니면 외래 키의 존재가이를 제공해야합니까?

답변:


137

외래 키 제약 조건만으로는 Oracle에 인덱스를 제공하지 않습니다. 인덱스를 만들어야하며 만들어야합니다.


11
일부 데이터베이스에서 외래 키 제약 조건을 생성하면 인덱스도 생성됩니다. 예 : Jet Engine (MSAccess 파일, Firebird 및 MySQL)
bubi

17
이 대답은 특정 데이터베이스 구현을 명시 적으로 언급하지 않고는 의미가 없습니다. 물론 질문에 태그가 지정되어 oracle있지만 Google 검색에서 여기에 도착했을 때 즉시 명확하지 않습니다.
developerbmw

5
PostgreSQL (적어도이 게시물 당시)이 자동으로 수행하지 않음을 확인할 수 있습니다.
The Dembinski

내가 아는 한 SQL Server (2016, Azure ...)에 대한 동일한 대답입니다.
Pac0

Oracle에서 외래 키에 인덱스를 만들어야하는 이유는 무엇입니까? 그렇게하지 않으면 어떤 결과가 발생합니까?
Đỗ Công Bằng

46

외래 키를 생성해도 A.B_ID에 인덱스가 자동으로 생성되지는 않습니다. 따라서 일반적으로 쿼리 성능 관점에서 A.B_ID에 별도의 인덱스를 만드는 것이 합리적입니다.

B의 행을 삭제 한 경우 A.B_ID가 인덱싱되기를 원합니다. 그렇지 않으면 Oracle은 분리 된 레코드가 없는지 확인하기 위해 B에서 행을 삭제할 때마다 A에 대해 전체 테이블 스캔을 수행해야합니다 (Oracle 버전에 따라 추가 잠금 영향도있을 수 있지만 감소됨 최신 Oracle 버전).


1
PFK 컬럼은 어떻습니까? 예를 들어 다 대다 관계에 대한 중간 테이블이있는 경우이 테이블의 두 PFK 열에 대한 인덱스를 만들어야합니까?
Clamari

3
@Clamari-C에 (A_ID, B_ID)의 기본 키가있는 경우 기본 키가 A에서 삭제할 수 있도록 처리합니다. 또한 B에서 효율적으로 삭제할 수 있도록하려면에 대한 인덱스를 원할 것입니다 B_ID.
Justin Cave

25

더 많은 정보를 위해 : Oracle은 (a) 제약을 적용 할 필요가없고 (b) 어떤 경우에는 필요하지 않기 때문에 (고유 제약의 경우처럼) 인덱스를 자동으로 생성하지 않습니다.

그러나 대부분 의 경우 인덱스를 생성하려고합니다 (실제로 Oracle Apex에는 "인덱싱되지 않은 외래 키"에 대한 보고서가 있습니다).

애플리케이션이 상위 테이블의 행을 삭제하거나 PK 값을 업데이트 할 수 있어야 할 때 (희귀함) 인덱스가없는 경우 DML은 전체 하위 테이블을 잠 가야하기 때문에 문제가 발생합니다.

일반적으로 인덱스를 추가 하지 않기로 선택하는 경우 는 FK가 열의 도메인 (예 : 상태 코드 테이블)을 정의하는 "정적 데이터"테이블에있는 경우이며 부모 테이블에 대한 업데이트 및 삭제가 수행되지 않습니다. 응용 프로그램에서 직접. 그러나 열에 인덱스를 추가하면 응용 프로그램의 중요한 쿼리에 이점이있는 경우에도 인덱스를 사용하는 것이 좋습니다.


14

SQL Server는 외래 키 열에 인덱스를 자동으로 배치 한 적이 없습니다 .이 도시 신화의 배경과 역사에 대한 Kim Tripp의 훌륭한 블로그 게시물 을 확인하십시오.

일반적으로 외래 키 열을 인덱싱하는 것이 좋습니다. 따라서 각 FK 열이 인덱스에 의해 백업되는지 확인하는 것이 좋습니다. 하나의 열에 만있는 것은 아닙니다. FK 열을 첫 번째 열로 사용하여 두 개 또는 세 개의 열에 인덱스를 만드는 것이 합리적 일 수 있습니다. 시나리오와 데이터에 따라 다릅니다.


8

성능상의 이유로 인덱스를 생성해야합니다. 기본 테이블의 삭제 작업 (삭제중인 레코드가 사용되지 않는지 확인하기 위해) 및 일반적으로 외래 키가 관련된 조인에 사용됩니다. 인덱스가 필요하지 않은 테이블은 몇 개뿐입니다 (로그에 생성하지 않음).이 경우에는 외래 키 제약 조건도 필요하지 않을 수 있습니다.

그러나

이미 외래 키에 대한 인덱스를 자동으로 생성하는 데이터베이스가 있습니다. Jet Engine (Microsoft Access 파일) Firebird MySQL

확실히

SQL 서버 오라클

하지 않습니다


3
FIrebird SQL이 자동으로 수행한다고 언급 한 Thx. 그것이 바로 제가 찾던 요점입니다.
user424855 2015

1

성능과 관련된 모든 것과 마찬가지로 이는 여러 요인에 따라 달라지며 예를 들어 매우 높은 활동 환경에서 인덱스 유지 관리가 허용되지 않을 수 있습니다.

여기서 가장 두드러진 것은 선택 성인 것 같습니다. 인덱스의 값이 중복되는 경우 인덱스를 삭제하고 (가능한 경우) 테이블 스캔을 허용하는 것이 더 나은 성능을 제공 할 수 있습니다.


1

UNIQUE, PRIMARY KEY 및 FOREIGN KEY 제약 조건은 제약 조건을 적용하거나 "뒤집는"인덱스를 생성합니다 (때로는 백업 인덱스라고도 함). PRIMARY KEY 제약 조건은 고유 인덱스를 생성합니다. FOREIGN KEY 제약 조건은 고유하지 않은 인덱스를 생성합니다. UNIQUE 제약 조건은 모든 열이 Null을 허용하지 않는 경우 고유 인덱스를 생성하고 하나 이상의 열이 Null을 허용하는 경우 고유하지 않은 인덱스를 생성합니다. 따라서 열 또는 열 집합에 UNIQUE, PRIMARY KEY 또는 FOREIGN KEY 제약 조건이있는 경우 성능을 위해 해당 열에 인덱스를 만들 필요가 없습니다.



링크 한 문서는 Oracle이 아닌 임베디드 Java 데이터베이스 인 Derby 용입니다.
Davos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.