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

Oracle 10g - optimieren, WO NICHT NULL IST

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.