Optimizeren mener, at den fulde tabelscanning bliver bedre.
Hvis der kun er nogle få NULL
rækker, er optimeringsværktøjet rigtigt.
Hvis du er helt sikker på, at indeksadgangen vil være hurtigere (det vil sige, du har mere end 75%
rækker med col1 IS NULL
), og antyd derefter din forespørgsel:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Hvorfor 75%
?
Fordi du bruger INDEX SCAN
at hente værdier, der ikke er dækket af indekset, indebærer en skjult joinforbindelse på ROWID
, hvilket koster omkring 4
gange så meget som tabelscanning.
Hvis indeksområdet omfatter mere end 25%
af rækker, er tabelscanningen normalt hurtigere.
Som nævnt af Tony Andrews
, klyngefaktor er mere nøjagtig metode til at måle denne værdi, men 25%
er stadig en god tommelfingerregel.