Der Optimierer denkt, dass der vollständige Tabellenscan besser ist.
Wenn es nur wenige NULL
gibt Zeilen, der Optimierer hat recht.
Wenn Sie absolut sicher sind, dass der Indexzugriff schneller sein wird (d. h., Sie haben mehr als 75%
Zeilen mit col1 IS NULL
), geben Sie dann Ihre Abfrage an:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Warum 75%
?
Weil mit INDEX SCAN
Das Abrufen von Werten, die nicht vom Index abgedeckt sind, impliziert einen versteckten Join auf ROWID
, was etwa 4
kostet mal so viel wie Tabellenscan.
Wenn der Indexbereich mehr als 25%
umfasst von Zeilen ist der Tabellenscan normalerweise schneller.
Wie von Tony Andrews
erwähnt , der Clusterfaktor ist eine genauere Methode zur Messung dieses Werts, aber 25%
ist immer noch eine gute Faustregel.