문제

Oracle의 여러 열에서 기본 키를 설정하면 필요한 경우 인덱스를 만들어야합니까?

나는 당신이 기본 키를 설정할 때 하나 열, 당신은 그것에 의해 그것을 색인화했습니다; 여러 열 PK와 동일합니까?

감사

도움이 되었습니까?

해결책

아니요, 개별 필드에 대한 인덱스가 생성되지 않습니다.

Composit Key Fielda, Fieldb, Fieldc 및 You가있는 경우

select * from MyTable where FieldA = :a 

또는

select * from MyTable where FieldA = :a and FieldB = :b

그런 다음이 색인을 사용합니다 (키의 첫 두 필드이기 때문에).

당신이 가지고 있다면

select * from MyTable where FieldB = :b and FieldC = :c

인덱스의 일부를 사용하지만 전체 인덱스가 아닌 경우 인덱스 스킵 스캔, 전체 인덱스 스캔 또는 빠른 전체 인덱스 스캔을 통해 인덱스가 덜 효율적으로 사용됩니다.

(수정에 대한 David Aldridge에게 감사합니다)

다른 팁

열 (a, b, c)에서 기본 키를 만들면 Oracle은 기본적으로 (a, B. c)에서 고유 인덱스를 만듭니다. Oracle에게 다음과 같은 다른 (반드시 고유 한) 기존 인덱스를 사용하라고 말할 수 있습니다.

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;

여러 열에서 하나의 인덱스가 표시되며 각 열에 인덱스가있는 것과 다릅니다.

기본 키는 생성을 의미합니다 composite unique index 기본 키 열에서.

호출 된 특수 액세스 경로를 사용할 수 있습니다 INDEX SKIP SCAN 첫 번째 색인 된 열을 포함하지 않는 Predicates와 함께이 색인을 사용하려면 다음과 같습니다.

SQL> CREATE TABLE t_multiple (mul_first INTEGER NOT NULL, mul_second INTEGER NOT NULL, mul_data VARCHAR2(200))
  2  /
Table created

SQL> ALTER TABLE t_multiple ADD CONSTRAINT pk_mul_first_second PRIMARY KEY (mul_first, mul_second)
  2  /
Table altered

SELECT  /*+ INDEX_SS (m pk_mul_first_second) */
    *
FROM    t_multiple m
WHERE   mul_second = :test 

SELECT STATEMENT, GOAL = ALL_ROWS                            
 TABLE ACCESS BY INDEX ROWID       SCOTT    T_MULTIPLE
  INDEX SKIP SCAN                  SCOTT    PK_MUL_FIRST_SECOND

기본 키는 하나의 (고유 한) 인덱스이며 아마도 여러 열을 포함 할 수 있습니다.

B의 경우 컬럼 A가 카디널리티가 낮은 경우 선택 색인이 사용됩니다 (예 : A는 2 값 만 있습니다). 일반적으로 열이 별도로 인덱싱되지 않았지만 열을 인덱싱 한 것으로 상상했다면이 답변을 추측 할 수있었습니다 (완전히 사실은 아니지만 첫 번째 근사치에 적합합니다). 따라서 A, B 인덱스는 A || B 인덱스와 비슷합니다.

기본 키 구조에 따라 열에서 개별 색인을 설정해야 할 수도 있습니다.

복합 기본 키 및 인덱스는 다음 방식으로 인덱스를 생성합니다. a, b, c 및 ia 열이 있다고 가정 해 봅시다. 이로 인해 인덱스가 발생합니다

  • (A, B, C)
  • (A, B)
  • (ㅏ)

Oracle은 실제로 대부분의 왼쪽 열 그룹에 인덱스를 만듭니다. 따라서 ... B 열 B에서 인덱스를 원한다면 기본 키뿐만 아니라 하나를 만들어야합니다.

추신 MySQL 이이 대부분의 동작을 종료한다는 것을 알고 있습니다.

오라클에서는 정확한 진술이 아닙니다. (a, b, c)에서 1 인덱스 만 생성합니다. (a, b) 및 (a) 색인을 생성하지 않습니다.

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