답변:
외래 키 제약 조건만으로는 Oracle에 인덱스를 제공하지 않습니다. 인덱스를 만들어야하며 만들어야합니다.
oracle
있지만 Google 검색에서 여기에 도착했을 때 즉시 명확하지 않습니다.
외래 키를 생성해도 A.B_ID에 인덱스가 자동으로 생성되지는 않습니다. 따라서 일반적으로 쿼리 성능 관점에서 A.B_ID에 별도의 인덱스를 만드는 것이 합리적입니다.
B의 행을 삭제 한 경우 A.B_ID가 인덱싱되기를 원합니다. 그렇지 않으면 Oracle은 분리 된 레코드가 없는지 확인하기 위해 B에서 행을 삭제할 때마다 A에 대해 전체 테이블 스캔을 수행해야합니다 (Oracle 버전에 따라 추가 잠금 영향도있을 수 있지만 감소됨 최신 Oracle 버전).
B_ID
.
더 많은 정보를 위해 : Oracle은 (a) 제약을 적용 할 필요가없고 (b) 어떤 경우에는 필요하지 않기 때문에 (고유 제약의 경우처럼) 인덱스를 자동으로 생성하지 않습니다.
그러나 대부분 의 경우 인덱스를 생성하려고합니다 (실제로 Oracle Apex에는 "인덱싱되지 않은 외래 키"에 대한 보고서가 있습니다).
애플리케이션이 상위 테이블의 행을 삭제하거나 PK 값을 업데이트 할 수 있어야 할 때 (희귀함) 인덱스가없는 경우 DML은 전체 하위 테이블을 잠 가야하기 때문에 문제가 발생합니다.
일반적으로 인덱스를 추가 하지 않기로 선택하는 경우 는 FK가 열의 도메인 (예 : 상태 코드 테이블)을 정의하는 "정적 데이터"테이블에있는 경우이며 부모 테이블에 대한 업데이트 및 삭제가 수행되지 않습니다. 응용 프로그램에서 직접. 그러나 열에 인덱스를 추가하면 응용 프로그램의 중요한 쿼리에 이점이있는 경우에도 인덱스를 사용하는 것이 좋습니다.
SQL Server는 외래 키 열에 인덱스를 자동으로 배치 한 적이 없습니다 .이 도시 신화의 배경과 역사에 대한 Kim Tripp의 훌륭한 블로그 게시물 을 확인하십시오.
일반적으로 외래 키 열을 인덱싱하는 것이 좋습니다. 따라서 각 FK 열이 인덱스에 의해 백업되는지 확인하는 것이 좋습니다. 하나의 열에 만있는 것은 아닙니다. FK 열을 첫 번째 열로 사용하여 두 개 또는 세 개의 열에 인덱스를 만드는 것이 합리적 일 수 있습니다. 시나리오와 데이터에 따라 다릅니다.
성능상의 이유로 인덱스를 생성해야합니다. 기본 테이블의 삭제 작업 (삭제중인 레코드가 사용되지 않는지 확인하기 위해) 및 일반적으로 외래 키가 관련된 조인에 사용됩니다. 인덱스가 필요하지 않은 테이블은 몇 개뿐입니다 (로그에 생성하지 않음).이 경우에는 외래 키 제약 조건도 필요하지 않을 수 있습니다.
그러나
이미 외래 키에 대한 인덱스를 자동으로 생성하는 데이터베이스가 있습니다. Jet Engine (Microsoft Access 파일) Firebird MySQL
확실히
SQL 서버 오라클
하지 않습니다
UNIQUE, PRIMARY KEY 및 FOREIGN KEY 제약 조건은 제약 조건을 적용하거나 "뒤집는"인덱스를 생성합니다 (때로는 백업 인덱스라고도 함). PRIMARY KEY 제약 조건은 고유 인덱스를 생성합니다. FOREIGN KEY 제약 조건은 고유하지 않은 인덱스를 생성합니다. UNIQUE 제약 조건은 모든 열이 Null을 허용하지 않는 경우 고유 인덱스를 생성하고 하나 이상의 열이 Null을 허용하는 경우 고유하지 않은 인덱스를 생성합니다. 따라서 열 또는 열 집합에 UNIQUE, PRIMARY KEY 또는 FOREIGN KEY 제약 조건이있는 경우 성능을 위해 해당 열에 인덱스를 만들 필요가 없습니다.