9

Oracle で複数の列に主キーを設定する場合、必要に応じてインデックスも作成する必要がありますか?

ある列に主キーを設定すると、それによって索引が付けられると思います。複数列のPKでも同じですか?

ありがとう

4

8 に答える 8

12

いいえ、個々のフィールドのインデックスは作成されません。

複合キー 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 に感謝)

于 2009-02-10T12:12:34.133 に答える
4

列 (A、B、C) に主キーを作成すると、Oracle はデフォルトで (A、B、C) に一意のインデックスを作成します。次のように、別の (必ずしも一意ではない) 既存のインデックスを使用するように Oracle に指示できます。

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;
于 2009-02-10T12:17:59.613 に答える
2

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
于 2009-02-10T13:17:01.000 に答える
2

複数の列にわたって 1 つのインデックスを取得しますが、これは各列にインデックスを持つこととは異なります。

于 2009-02-10T12:09:47.323 に答える
0

主キーの構造によっては、列に個別のインデックスを設定する必要がある場合があります。

複合主キーとインデックスは、次の方法でインデックスを作成します。列A、B、Cがあり、iaが(A、B、C)に主キーを作成するとします。これにより、インデックスが作成されます

  • (A、B、C)
  • (A、B)
  • (A)

Oracleは、実際には、左端の列グループのいずれかにインデックスを作成します。つまり...列Bだけにインデックスが必要な場合は、そのインデックスと主キーを作成する必要があります。

PS私はMySQLがこれを最も残した振る舞いを示していることを知っており、SQLServerも最も残されていると思います

于 2009-02-10T23:02:36.350 に答える
0

B の場合、列 a のカーディナリティが低い場合のみ (たとえば、値が 2 つしかない場合)、選択インデックスが使用されます。一般に、列が個別にインデックス付けされていないのではなく、インデックス付けされた列の連結を想像していれば、この答えを推測できたはずです (完全に正しいわけではありませんが、最初の概算では機能します)。つまり、a、b インデックスではなく、a||b インデックスに似ています。

于 2009-02-10T12:44:05.713 に答える
0

Oracle では、これは正確なステートメントではありません。(A、B、C) にインデックスを 1 つだけ作成します。(A,B) および (A) インデックスを作成しません。

于 2010-03-11T19:02:45.353 に答える
0

主キーは 1 つの (一意の) インデックスであり、複数の列を含む可能性があります

于 2009-02-10T12:10:23.453 に答える