Оптимизаторът смята, че пълното сканиране на таблицата ще бъде по-добро.
Ако има само няколко NULL
редове, оптимизаторът е прав.
Ако сте абсолютно сигурни, че достъпът до индекса ще бъде по-бърз (тоест имате повече от 75%
редове с col1 IS NULL
), след което подскажете вашата заявка:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
Защо 75%
?
Тъй като се използва INDEX SCAN
за извличане на стойности, които не са обхванати от индекса, предполага скрито присъединяване към ROWID
, което струва около 4
пъти повече от сканирането на таблицата.
Ако диапазонът на индекса включва повече от 25%
от редове, сканирането на таблицата обикновено е по-бързо.
Както бе споменато от Tony Andrews
, факторът на групиране е по-точен метод за измерване на тази стойност, но 25%
все още е добро правило.