Frage

Wenn ich einen Primärschlüssel in mehreren Spalten in Oracle gesetzt, muss ich auch die Indizes erstellen, wenn ich sie brauche?

Ich glaube, dass, wenn Sie einen Primärschlüssel auf setzen ein Spalte, können Sie es, indem sie es indiziert haben; ist es das gleiche mit mehreren Spalte PKs?

Danke

War es hilfreich?

Lösung

Nein, Indizes werden nicht für die einzelne Felder erstellt werden.

Wenn Sie einen Composit Schlüssel FieldA, FieldB, FieldC und Sie

select * from MyTable where FieldA = :a 

oder

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

Dann wird es diesen Index verwenden,

(weil es ihr die ersten beiden Felder im Schlüssel sind)

Wenn Sie

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

Wenn Sie Teile des Index verwenden, aber nicht den vollen Index wird der Index weniger effizient Scan, vollständigen Index-Scan oder schnellen Voll Index-Scan überspringt über einen Index verwendet werden.

(Danke an David Aldridge für die Korrektur)

Andere Tipps

Wenn Sie einen Primärschlüssel für die Spalten (A, B, C) erstellen, dann wird Oracle standardmäßig auf einen eindeutigen Index erstellen (A, B, C). Sie können Oracle erzählen eine andere (nicht unbedingt eindeutig) bestehenden Index wie folgt zu verwenden:

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

Sie werden einen Index über mehrere Spalten erhalten, die als solche mit einem Index für jede Spalte nicht gleich ist.

Primärschlüssel impliziert eine composite unique index auf Primärschlüsselspalten zu schaffen.

Sie können einen speziellen Zugriffspfad INDEX SKIP SCAN genannt verwenden diesen Index mit Prädikaten zu verwenden, die die erste indexierte Spalte nicht enthalten:

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

Ein Primärschlüssel ist nur ein (unique) Index, möglicherweise mehrere Spalten

enthaltend

Für B wird Auswahlindex verwendet werden, wenn die Spalte eine geringe Mächtigkeit haben nur (beispielsweise eine nur 2 Werte). In der Regel diese Antwort konnte ahnen, wenn Sie gedacht, dass Spalten nicht separat indiziert, aber Verkettung von Spalten indiziert (es ist nicht ganz wahr ist, aber es funktioniert für die erste Näherung). Es ist also nicht a, b Index, es ist mehr wie ein || b Index.

Sie müssen möglicherweise einzelne Indizes für die Spalten setzen auf Ihrer Primärschlüsselstruktur abhängig.

Composite-Primärschlüssel und Indizes Indizes in der folgenden Art und Weise erstellen. Sagen, ich habe die Spalten A, B, C und a i den Primärschlüssel auf (A, B, C) zu erzeugen. Dies wird in den Indizes führen

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

Oracle schafft tatsächlich einen Index für jede der äußersten linken Spalte Gruppierungen. So ... Wenn Sie nur die Spalte B einen Index wollen müssen Sie erstellen für sie sowie den Primärschlüssel.

P. S. Ich weiß, MySQL exibits dies am Verhalten verlassen und ich denke, SQL Server auch die meisten verlassen wird

In Oracle, das ist nicht eine genaue Aussage. Es erzeugt nur 1 Index auf (A, B, C). Schaff nicht (A, B) und (A) Indizes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top