Czym jest wartość NULL czytelnikom mojego bloga raczej przypominać nie muszę. Każdy wie, że może on generować cały wachlarz problemów. Do tego wachlarza zalicza się również pytanie o indeksy na kolumnach, w których mamy wartości NULL.
O ile świadomość, że jeśli w kolumnie jest więcej NULLów niż wartości to indeks jest zupełnie nie na miejscu jest raczej powszechna, o tyle wiedza co zrobić z indeksem, kiedy mamy jakiś procent wartości NULL jest już dużo mniejsza.

ORACLE NIE INDEKSUJE WARTOŚCI NULL

Oracle nie pozwala na to, by indeksować wartości NULL i oczywiście nie pozwoli na wstawienie wartości NULL do kolumny z kluczem głównym. Indeksować za to może wartości klucza złożonego(składającego się z wielu kolumn), jeśli oczywiście choć jedna z kolumn jest różna od NULL.
Istnieje możliwość zmuszenia ORACLE do utworzenia indeksu na wartości NULL albo poprzez rzeczony klucz złożony, albo poprzez indeks bazujący na funkcji (FBI).
Przykład zmuszenia ORACLE do indeksowania wartości NULL za pomocą sztucznego klucza złożonego

CREATE INDEX CustPhone_IDX
ON Customers (CustPhoneNumber ASC, 1);

Można również wykorzystać wartości NULL w indeksie, gdy użyjemy funkcji NVL do konwersji NULLa na inną wartość:

CREATE INDEX CustPhone_IDX
ON Customers (NVL(CustPhoneNumber, 'unknown'));

Minusem wykorzystania NVL przy budowie indeksu jest to, że trzeba z tej funkcji skorzystać podczas szukania wartości NULL, aby indeks zadziałał.

Written by Przemysław Starosta