De optimizer denkt dat de volledige tabelscan beter zal zijn.
Als er maar een paar NULL
. zijn rijen, de optimizer heeft gelijk.
Als u er absoluut zeker van bent dat de toegang tot de index sneller zal zijn (dat wil zeggen, u heeft meer dan 75%
rijen met col1 IS NULL
), hint dan op uw vraag:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Waarom 75%
?
Omdat het gebruik van INDEX SCAN
om waarden op te halen die niet door de index worden gedekt, impliceert een verborgen join op ROWID
, die ongeveer 4
kost keer zoveel als tafelscannen.
Als het indexbereik meer dan 25%
omvat van rijen is de tabelscan meestal sneller.
Zoals vermeld door Tony Andrews
, clusterfactor is een nauwkeurigere methode om deze waarde te meten, maar 25%
is nog steeds een goede vuistregel.