복붙노트

[SQL] 나는 오라클의 외래 키에 인덱스를 생성해야합니까?

SQL

나는 오라클의 외래 키에 인덱스를 생성해야합니까?

나는 테이블 A와 테이블 B를 A는 B의 기본 키, B_ID에 B에 외래 키를 가지고 있습니다.

몇 가지 이유 (I 합법적 인 이유가 알고있는) I 키에이 두 테이블을 조인 할 때 인덱스를 사용하지 않는하십시오.

또는 외부 키의 존재 여부가를 제공해야 내가 별도로 A.B_ID에 인덱스를 생성해야합니까?

해결법

  1. ==============================

    1.일 명해야합니다 (그리고해야한다)을 만들 수 - 외래 키 제약 혼자 오라클 인덱스를 제공하지 않습니다.

    일 명해야합니다 (그리고해야한다)을 만들 수 - 외래 키 제약 혼자 오라클 인덱스를 제공하지 않습니다.

  2. ==============================

    2.외부 키를 생성하면 자동으로 A.B_ID에 인덱스를 생성하지 않습니다. 그래서 일반적으로 A.B_ID에 별도의 인덱스를 생성하기 위해 쿼리 성능의 관점에서 의미가있다.

    외부 키를 생성하면 자동으로 A.B_ID에 인덱스를 생성하지 않습니다. 그래서 일반적으로 A.B_ID에 별도의 인덱스를 생성하기 위해 쿼리 성능의 관점에서 의미가있다.

    B에서 혹시 삭제 행, 당신은 확실히하려면 A.B_ID 인덱싱 할 수 있습니다. 그렇지 않으면, 오라클은에 확실 오라클 버전에 따라 더 분리 된 레코드 (이 없는지 확인하기 위해 B에서 행을 삭제할 때마다 전체 테이블 스캔을해야 할 것,이뿐만 아니라 추가 잠금 영향을 수 있지만, 사람들은 감소된다 최근 오라클 버전).

  3. ==============================

    3.그냥 추가 정보를 원하시면 : (이 고유 제한 조건의 경우와 같이) (A) 당신이 하나를 필요로하지 않는 경우에 따라서는 제약, 그리고 (b)를 적용 할 필요가 없습니다 때문에 오라클이 자동으로 인덱스를 생성하지 않습니다.

    그냥 추가 정보를 원하시면 : (이 고유 제한 조건의 경우와 같이) (A) 당신이 하나를 필요로하지 않는 경우에 따라서는 제약, 그리고 (b)를 적용 할 필요가 없습니다 때문에 오라클이 자동으로 인덱스를 생성하지 않습니다.

    대부분의 시간은, 그러나, 당신은 (사실, 오라클 에이펙스에서 "인덱싱되지 않은 외래 키"의 보고서가있다) 인덱스를 생성 할 것입니다.

    응용 프로그램 (희귀 임) PK 값을 부모 테이블에서 행을 삭제하거나 업데이트 할 수 있어야 할 때마다 인덱스가 존재하지 않는 경우는 전체 자식 테이블을 고정해야합니다 때문에 DML은 겪을 것이다.

    FK는 "정적 데이터"테이블에 어디 보통 인덱스를 추가하지 않도록 선택 례는 그 부모 테이블에 업데이트 및 삭제가 수행되지 않습니다 열의를 정의 도메인 (상태 코드의 예를 들어 테이블) 직접 응용 프로그램에서. 컬럼에 인덱스를 추가하는 응용 프로그램의 중요한 쿼리에 혜택을 제공하는 경우에는 다음 지수는 여전히 좋은 생각이 될 것입니다.

  4. ==============================

    4.SQL Server는 자동으로 외래 키 컬럼에 인덱스를 넣어 적이있다 - 수표를 김 트립의 우수한 블로그 게시물에서이 도시의 신화의 배경과 역사에.

    SQL Server는 자동으로 외래 키 컬럼에 인덱스를 넣어 적이있다 - 수표를 김 트립의 우수한 블로그 게시물에서이 도시의 신화의 배경과 역사에.

    그것은 그러나, 일반적으로 외래 키 컬럼 인덱스에 좋은 아이디어이다 - 그래서 그래, 난 확실히 각 FK 열이 인덱스에 의해 백업하고 추천 할 것입니다; 반드시 혼자 한 칼럼에 - 어쩌면 거기에서 처음으로 FK 열이 두 개 또는 세 개의 컬럼에 인덱스를 생성하는 것이 할 수 있습니다. 시나리오 및 데이터에 따라 다릅니다.

  5. ==============================

    5.성능상의 이유로 인덱스가 생성되어야한다. 기본 테이블에 삭제 작업에 사용됩니다 (당신이 삭제하는 레코드가 사용되지 않음을 확인)와에 일반적으로 외래 키가 관련되어 있음을 결합한다. 단지 몇 테이블 (나는 로그를 생성하지 않음) 인덱스 그러나 아마,이 경우에 아마 당신이 외래 키 제약 조건을 필요도 없습니다를하지 않아도 될 수 있습니다.

    성능상의 이유로 인덱스가 생성되어야한다. 기본 테이블에 삭제 작업에 사용됩니다 (당신이 삭제하는 레코드가 사용되지 않음을 확인)와에 일반적으로 외래 키가 관련되어 있음을 결합한다. 단지 몇 테이블 (나는 로그를 생성하지 않음) 인덱스 그러나 아마,이 경우에 아마 당신이 외래 키 제약 조건을 필요도 없습니다를하지 않아도 될 수 있습니다.

    그러나

    이미 자동으로 외래 키에 인덱스를 만드는 일부 데이터베이스가 있습니다. 제트 엔진 (Microsoft Access에서 파일) 파이어 버드 MySQL의

    대한 SURE

    SQL 서버 신탁

    하지 않습니다

  6. ==============================

    6.아무것도 성능과 관련된과 마찬가지로, 많은 요인에 따라 달라집니다 더 silve 총알은, 예를 들어이 없습니다 매우 높은 activilty 환경에서 인덱스의 유지 관리 -은 받아 들일 수 있습니다.

    아무것도 성능과 관련된과 마찬가지로, 많은 요인에 따라 달라집니다 더 silve 총알은, 예를 들어이 없습니다 매우 높은 activilty 환경에서 인덱스의 유지 관리 -은 받아 들일 수 있습니다.

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

  7. ==============================

    7.UNIQUE, PRIMARY KEY 및 FOREIGN KEY 제약 조건이 시행 또는 "뒤로"제약 (때로는 백업 인덱스라고합니다) 인덱스를 생성합니다. PRIMARY KEY 제약 조건이 고유 인덱스를 생성합니다. FOREIGN KEY 제약 조건이 고유하지 않은 인덱스를 생성합니다. 모든 열이 nullable이 아닌 경우 UNIQUE 제약 조건이 고유 인덱스를 생성하고, 하나 이상의 열이 널이 있다면 그들은 고유하지 않은 인덱스를 생성합니다. 컬럼의 열 또는 세트 그것에 UNIQUE, PRIMARY KEY 또는 FOREIGN KEY 제약 조건이있는 경우 따라서, 당신은 성능을 위해 그 컬럼에 인덱스를 만들 필요가 없습니다.

    UNIQUE, PRIMARY KEY 및 FOREIGN KEY 제약 조건이 시행 또는 "뒤로"제약 (때로는 백업 인덱스라고합니다) 인덱스를 생성합니다. PRIMARY KEY 제약 조건이 고유 인덱스를 생성합니다. FOREIGN KEY 제약 조건이 고유하지 않은 인덱스를 생성합니다. 모든 열이 nullable이 아닌 경우 UNIQUE 제약 조건이 고유 인덱스를 생성하고, 하나 이상의 열이 널이 있다면 그들은 고유하지 않은 인덱스를 생성합니다. 컬럼의 열 또는 세트 그것에 UNIQUE, PRIMARY KEY 또는 FOREIGN KEY 제약 조건이있는 경우 따라서, 당신은 성능을 위해 그 컬럼에 인덱스를 만들 필요가 없습니다.

  8. from https://stackoverflow.com/questions/4127206/do-i-need-to-create-indexes-on-foreign-keys-on-oracle by cc-by-sa and MIT license