Есть таблица с историческими значениями, история задается парой полей DATE_BEG и DATE_END.
DATE_BEG — дата начала действия записи (включительно), DATE_END — дата окончания действия записи (не включительно), если равно null, значит дата окончания не задана. Есть индексы по этим полям.
Пример значений:
history_id | item_id | value | date_beg | date_end | 1 | 1 | 0 | 2001-01-01 | 2001-02-01 | 2 | 1 | 1 | 2001-02-01 | 2001-05-15 | 3 | 1 | 2 | 2001-05-15 | |
|
Здесь для записи задается значение 0 на 01.01.2001, с 01.02.2001 действует значение 1 и с 15.05.2001 действует значение 2.
Два запроса:
select item.item_id, history.value, history.date_beg
from item
join history (history.item_id = item.item_id and history.date_beg <= sysdate and nvl(history.date_end, date'9999-01-01') > sysdate)
select item.item_id, history.value, history.date_beg
from item
join history (history.item_id = item.item_id and history.date_beg <= sysdate and (history.date_end > sysdate or history.date_end is null))
Если смотреть планы, то в первом запросе индекс не используется, во втором используется.
Но почему-то первый запрос выполняется 800 мс, а второй запрос выполняется 4 с.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.