Nein, das kann falsch sein.
Wenn Sie einen großen Tisch haben, Oracle
kann es vorziehen, die Felder aus den Indizes statt aus der Tabelle abzuleiten, auch wenn es keinen einzigen Index gibt, der alle Werte abdeckt.
Im neuesten Artikel in meinem Blog:
gibt es eine Abfrage, bei der Oracle
verwendet keinen vollständigen Tabellenscan, sondern verknüpft zwei Indizes, um die Spaltenwerte zu erhalten:
SELECT l.id, l.value
FROM t_left l
WHERE NOT EXISTS
(
SELECT value
FROM t_right r
WHERE r.value = l.value
)
Der Plan ist:
SELECT STATEMENT
HASH JOIN ANTI
VIEW , 20090917_anti.index$_join$_001
HASH JOIN
INDEX FAST FULL SCAN, 20090917_anti.PK_LEFT_ID
INDEX FAST FULL SCAN, 20090917_anti.IX_LEFT_VALUE
INDEX FAST FULL SCAN, 20090917_anti.IX_RIGHT_VALUE
Wie Sie sehen können, gibt es keine TABLE SCAN
en t_left
hier.
Stattdessen, Oracle
nimmt die Indizes auf id
y value
gesellt sich zu ihnen auf rowid
und erhält die (id, value)
Paare aus dem Verknüpfungsergebnis.
Nun zu Ihrer Frage:
SELECT *
FROM some_table
WHERE field_one is not null and field_two = ?
GROUP BY
field_three, field_four, field_five
Erstens wird es nicht kompiliert, da Sie die Option *
aus einer Tabelle mit einer GROUP BY
Klausel.
Sie müssen Folgendes ersetzen *
mit Ausdrücken, die auf den Gruppierungsspalten und den Aggregaten der Nicht-Gruppierungsspalten basieren.
Der folgende Index wird Ihnen höchstwahrscheinlich von Nutzen sein:
CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)
da sie alles enthält, was für die Filterung von field_two
, Sortierung nach field_three, field_four, field_five
(nützlich für GROUP BY
) und stellen sicher, dass field_one
es NOT NULL
.