Gibt es einen Primärschlüssel, um in mehreren Spalten-Indizes für alle von ihnen zu generieren?
-
22-08-2019 - |
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
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
enthaltendFü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.