Optimeraren tror att genomsökningen av hela tabellen kommer att bli bättre.
Om det bara finns några NULL
rader är optimeraren rätt.
Om du är helt säker på att indexåtkomsten blir snabbare (det vill säga du har mer än 75%
rader med col1 IS NULL
), tipsa sedan om din fråga:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Varför 75%
?
Eftersom du använder INDEX SCAN
att hämta värden som inte täcks av indexet innebär en dold koppling på ROWID
, vilket kostar ungefär 4
gånger så mycket som tabellskanning.
Om indexintervallet innehåller mer än 25%
av rader är tabellsökningen vanligtvis snabbare.
Som nämnts av Tony Andrews
, klustringsfaktor är en mer exakt metod för att mäta detta värde, men 25%
är fortfarande en bra tumregel.