A tak dokładnie aby zadziałał, gdy chcemy zrobić zapytanie:
select * from tablica where kolumna is null;
Zakładamy wtedy indeks funkcyjny:
create index kolumna_idx on tablica (NVL(kolumna,TO_DATE(' 4000-01-01', 'syyyy-mm-dd')))
I wtedy musimy tak konstruować zapytanie, aby mogło wykorzystać powyższy indeks:
select * from tablica where NVL(kolumna,TO_DATE('4000-01-01', 'syyyy-mm-dd')) = TO_DATE('4000-01-01', 'syyyy-mm-dd')
Dla porównania koszt tradycyjnego zapytania:
select count(*) from dh_monitor.events where valid_to is null
to 8122. Dla porównania, zapytanie które wykorzystuje indeks ma koszt 3!!!
select count(*) from events where NVL(VALID_TO,TO_DATE('4000-01-01 ', 'syyyy-mm-dd')) = TO_DATE('4000-01-01', 'syyyy-mm-dd')
Dla tabeli, gdzie stosunek ilości nullowych wierszy do wszystkich w tabeli wynosi: 6.568/5.999.617