index mit mehreren Spalten - ok, wenn dabei die Abfrage auf nur eine Spalte?
Wenn ich eine Tabelle
create table sv ( id integer, data text )
und ein index:
create index myindex_idx on sv (id,text)
wäre das noch sinnvoll sein, wenn ich habe eine Abfrage
select * from sv where id = 10
Mein Grund für die Frage ist, dass ich bin auf der Suche durch eine Reihe von Tabellen mit Indizes und sehen Sie verschiedene Kombinationen von select-Abfragen. Einige Anwendungen nur eine andere Spalte hat mehr als eine. Muss ich haben-Indizes für beide sets ist oder ein all-inclusive-index-ok?
Ich bin das hinzufügen der Indizes für schnellere Suchvorgänge als full-table-scans.
Beispiel (bezogen auf die Antwort von Matt Huggins):
select * from table where col1 = 10
select * from table where col1 = 10 and col2=12
select * from table where col1 = 10 and col2=12 and col3 = 16
konnten alle abgedeckt werden, die durch den index-Tabelle (co1l1,col2,col3), aber
select * from table where col2=12
müsste einen anderen index?
- Ich habe gerade <3 StackOverflow. Ausgezeichnete Antworten übrigens besser als erwartet. Ich akzeptierte die Antwort, die ich verwendet, und ermöglichen höchste stimmten die Antwort zu sein, ergänzen Sie direkt unterhalb der akzeptierten Antworten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es sollte nützlich sein, da ein index auf (id, text) die ersten Indizes, die von id, dann text bzw..
Edit:, wenn ich sage, es ist "nützlich", ich meine, es ist nützlich im Hinblick auf die Geschwindigkeit von Abfragen/Optimierung. Als Sune Rievers wies darauf hin, es wird nicht bedeuten, dass Sie einen eindeutigen Datensatz nur die ID (es sei denn, Sie geben Sie die ID als unique in der Tabelle definition).
text
-- die Kosten-Schätzung könnte noch zu Gunsten eines index skip scan, index-scan, oder fast full index scan.Oracle unterstützt eine Reihe von Möglichkeiten, mit Hilfe eines index, und Sie sollten beginnen, indem Sie verstehen, alle von Ihnen, so haben Sie eine schnelle Lesen Sie hier: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#sthref973
Ihre Abfrage
select * from table where col2=12
sinnvoll nutzen, ein index skip scan, wenn die führende Spalte ist der sehr niedrige Kardinalität, oder ein fast full index scan, wenn es nicht ist. Diese würde wahrscheinlich in Ordnung sein, für das ausführen von berichten, jedoch für eine OLTP-Abfrage, ist es wahrscheinlich, dass Sie würde besser tun, um zu erstellen ein index mit col2 als führende Spalte.Ich gehe davon aus
id
ist Primärschlüssel. Es gibt keinen Punkt in das hinzufügen eines Primärschlüssels, um den index, da dieser immer eindeutig ist. Hinzufügen etwas einzigartiges, etwas anderes wird auch einzigartig sein.Hinzufügen eindeutigen index
text
, wenn man es wirklich braucht, ansonsten verwenden Sie einfachid
Einzigartigkeit ist für die Tabelle.Wenn
id
ist nicht dein primary key, dann werden Sie nicht garantiert, um ein einzigartiges Ergebnis aus der Abfrage.Bezüglich deinem letzten Beispiel mit lookup auf
col2
ich denke, Sie könnte müssen die anderen index. Indizes sind nicht ein Allheilmittel Lösung für performance Probleme obwohl, manchmal ist Ihr Datenbank-design oder Ihre Abfragen muss optimiert werden, zum Beispiel umgeschrieben in gespeicherten Prozeduren (und ich bin mir nicht ganz sicher, Oracle hat Ihnen, ich bin sicher, es gibt eine Oracle-äquivalent).Wenn der Fahrer hinter deiner Frage ist, Sie haben eine Tabelle mit mehreren Spalten und eine beliebige Kombination von diesen Spalten können in einer Abfrage verwendet, dann sollten Sie sich im BITMAP-Indizes.
Blick auf Ihr Beispiel:
Könnten Sie 3 bitmap-Indizes:
Diese bitmap-Indizes haben den großen Vorteil, dass Sie kombiniert als erforderlich.
So, jeder der folgenden Abfragen verwenden würden, eine oder mehrere der Indizes:
So, bitmap-Indizes kann eine option für Sie. Jedoch, wie David Aldridge wies darauf hin, abhängig von Ihrer speziellen Daten mit einem einzigen index für (col1,col2,col3) vorzuziehen. Wie immer, es hängt davon ab. Werfen Sie einen Blick auf Ihre Daten, die wahrscheinlich von Abfragen für diese Daten, und stellen Sie sicher, dass Ihre Statistiken aktuell sind.
Hoffe, das hilft.