Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum wird für diese Abfrage kein Index verwendet?

AKTUALISIERUNG: Versuchen Sie, die col-Spalte NICHT NULL zu machen. Das ist der Grund, warum es den Index nicht verwendet. Wenn es nicht null ist, hier ist der Plan.

SELECT STATEMENT, GOAL = ALL_ROWS           69  10  30
                    HASH GROUP BY           69  10  30
 INDEX FAST FULL SCAN   SANDBOX TEST_INDEX  56  98072   294216

Wenn der Optimierer feststellt, dass es effizienter ist, den Index NICHT zu verwenden (möglicherweise aufgrund des Umschreibens der Abfrage), wird er dies nicht tun. Optimierer-Hinweise sind genau das, nämlich Hinweise, um Oracle einen Index mitzuteilen, den Sie mögen es zu verwenden. Sie können sie als Vorschläge betrachten. Aber wenn der Optimierer feststellt, dass es besser ist, den Index nicht zu verwenden (wieder zum Beispiel als Ergebnis einer Abfrageumschreibung), dann wird er es nicht tun.

Siehe diesen Link:http://download. oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm "Die Angabe eines dieser Hinweise bewirkt, dass der Optimierer den angegebenen Zugriffspfad nur dann wählt, wenn der Zugriffspfad basierend auf der Existenz eines Index oder Clusters und auf den syntaktischen Konstrukten der SQL-Anweisung verfügbar ist. Wenn ein Hinweis einen nicht verfügbaren Zugriffspfad angibt, dann ignoriert es der Optimierer."

Da Sie eine count(*)-Operation ausführen, hat der Optimierer festgestellt, dass es effizienter ist, einfach die gesamte Tabelle und den Hash zu scannen, anstatt Ihren Index zu verwenden.

Hier ist ein weiterer praktischer Link zu Hinweisen:http://www.dba-oracle.com/t_hint_ignored. htm