Erstellen von Indizes für Felder nach Gruppen?
Tun, müssen Sie erstellen einen index für die Felder-Gruppe von Feldern in einer Oracle-Datenbank?
Beispiel:
select *
from some_table
where field_one is not null and field_two = ?
group by field_three, field_four, field_five
Ich war die Prüfung der Indizes, die ich erstellt für die oben-und der einzige relevante index für diese Abfrage einen index erstellt für field_two. Andere single-Feld oder zusammengesetzte Indizes erstellt, auf die anderen Felder werden nicht verwendet für die oben erwähnte Abfrage. Klingt das richtige?
InformationsquelleAutor der Frage onejigtwojig | 2009-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es korrekt sein, aber das würde davon abhängen, wie viele Daten Sie haben. Normalerweise würde ich erstellen Sie einen index für die Spalten, die ich mit in eine GRUPPE, aber in Ihrem Fall kann der Optimierer entschieden haben, dass nach der Verwendung der field_two index, dass es nicht genug Daten zurückgegeben, um zu rechtfertigen, mit der andere index für die GRUPPE DURCH.
InformationsquelleAutor der Antwort Eric Petroelje
Nein, das kann falsch sein.
Wenn Sie eine große Tabelle,
Oracle
bevorzugen kann, der Ableitung der Felder, die aus den Indizes eher als aus der Tabelle, auch gibt es keinen einzigen index über alle Werte.In der neuesten Artikel in meinem blog:
NICHT IN
vs.NICHT VORHANDEN
vs.LEFT JOIN /NULL
:Oracle
gibt es eine Abfrage, in der
Oracle
verwenden, die nicht mit full table scan, sondern verbindet zwei Indizes, um die Werte in der Spalte:Der plan ist:
Wie Sie sehen können, gibt es keine
TABLE SCAN
auft_left
hier.Stattdessen
Oracle
nimmt die Indizes aufid
undvalue
, schließt sich Ihnen aufrowid
und bekommt die(id, value)
Paare aus der join-Folge.Nun zu Ihrer Anfrage:
Erste, es wird nicht kompilieren, da sich die Auswahl der
*
aus einer Tabelle mit einerGROUP BY
- Klausel.Müssen Sie ersetzen
*
mit Ausdrücken basierend auf der Gruppierung von Spalten und Aggregate der non-Gruppierung-Spalten.Werden Sie wahrscheinlich profitieren Sie von den folgenden index:
werden, da es enthält alles, was für sowohl die Filterung als auch auf
field_two
-, Sortier-auffield_three, field_four, field_five
(nützlich fürGROUP BY
) und sicherstellen, dassfield_one
istNOT NULL
.InformationsquelleAutor der Antwort Quassnoi
Nicht. Sie brauchen nicht, in dem Sinne, dass eine Abfrage ausgeführt wird, unabhängig davon, ob Indizes vorhanden sind oder nicht. Indizes werden zur Verfügung gestellt, um die Abfrageleistung zu verbessern.
Kann es jedoch helfen, aber ich würde zögern, um einen index hinzuzufügen, nur, um zu helfen eine Abfrage, ohne nachdenken über die möglichen Auswirkungen des neuen index auf der Datenbank.
Nicht immer. Oft eine GRUPPE VON erfordern Oracle ausführen, eine Art (aber nicht immer); und Sie beseitigen kann der Sortiervorgang wird durch die Bereitstellung eines geeigneten index auf die Spalte(N) sortiert werden.
Ob Sie wirklich brauchen, um sorgen über die GROUP BY-Leistung, aber ist eine wichtige Frage für Sie zu denken.
InformationsquelleAutor der Antwort Jeffrey Kemp