여러 열에서 기본 키를 만드는 것이 모두 인덱스를 생성합니까?
-
22-08-2019 - |
문제
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) 색인을 생성하지 않습니다.