Oracle で複数の列に主キーを設定する場合、必要に応じてインデックスも作成する必要がありますか?
ある列に主キーを設定すると、それによって索引が付けられると思います。複数列のPKでも同じですか?
ありがとう
Oracle で複数の列に主キーを設定する場合、必要に応じてインデックスも作成する必要がありますか?
ある列に主キーを設定すると、それによって索引が付けられると思います。複数列のPKでも同じですか?
ありがとう
いいえ、個々のフィールドのインデックスは作成されません。
複合キー FieldA、FieldB、FieldC があり、
select * from MyTable where FieldA = :a
また
select * from MyTable where FieldA = :a and FieldB = :b
次に、このインデックスを使用します (キーの最初の 2 つのフィールドであるため)。
あなたが持っている場合
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
最初のインデックス付き列を含まない述語でこのインデックスを使用するために呼び出される特別なアクセス パスを使用できます。
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
複数の列にわたって 1 つのインデックスを取得しますが、これは各列にインデックスを持つこととは異なります。
主キーの構造によっては、列に個別のインデックスを設定する必要がある場合があります。
複合主キーとインデックスは、次の方法でインデックスを作成します。列A、B、Cがあり、iaが(A、B、C)に主キーを作成するとします。これにより、インデックスが作成されます
Oracleは、実際には、左端の列グループのいずれかにインデックスを作成します。つまり...列Bだけにインデックスが必要な場合は、そのインデックスと主キーを作成する必要があります。
PS私はMySQLがこれを最も残した振る舞いを示していることを知っており、SQLServerも最も残されていると思います
B の場合、列 a のカーディナリティが低い場合のみ (たとえば、値が 2 つしかない場合)、選択インデックスが使用されます。一般に、列が個別にインデックス付けされていないのではなく、インデックス付けされた列の連結を想像していれば、この答えを推測できたはずです (完全に正しいわけではありませんが、最初の概算では機能します)。つまり、a、b インデックスではなく、a||b インデックスに似ています。
Oracle では、これは正確なステートメントではありません。(A、B、C) にインデックスを 1 つだけ作成します。(A,B) および (A) インデックスを作成しません。
主キーは 1 つの (一意の) インデックスであり、複数の列を含む可能性があります