Как быстрее получить значение исторической записи, заданной диапазоном?

Alibek B.
Дата: 16.09.2015 13:39:51
Есть таблица с историческими значениями, история задается парой полей DATE_BEG и DATE_END.
DATE_BEG — дата начала действия записи (включительно), DATE_END — дата окончания действия записи (не включительно), если равно null, значит дата окончания не задана. Есть индексы по этим полям.
Пример значений:
history_iditem_idvaluedate_begdate_end
1102001-01-012001-02-01
2112001-02-012001-05-15
3122001-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 с.


________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
Elic
Дата: 16.09.2015 13:43:08
Alibek B.
Есть индексы по этим полям.
Нахрена? Тут нужен другой индекс.
ArtNick
Дата: 16.09.2015 13:50:34
Alibek B.,
Чаще используют составной индекс, первый элемент item_id, второй или дата начала или дата окончания, зависит он того по что обычно ищется.
ArtNick
Дата: 16.09.2015 13:54:12
Alibek B.
Но почему-то первый запрос выполняется 800 мс, а второй запрос выполняется 4 с..

Почему это, интересно? может потому что читает по индексу 90% таблицы?
Alibek B.
Дата: 16.09.2015 14:34:25
Elic
Нахрена? Тут нужен другой индекс.

Эти индексы были созданы разработчиками.
Составных индексов в исторической таблице нет, только индексы по отдельным столбцам.

ArtNick
Alibek B.,
Чаще используют составной индекс, первый элемент item_id, второй или дата начала или дата окончания, зависит он того по что обычно ищется.

Мне нужно узнать действующее значение на произвольную дату, которую я заранее не знаю.
Если будет составной индекс (item_id,date_beg), он будет задействован при джойне?

ArtNick
Почему это, интересно? может потому что читает по индексу 90% таблицы?

Я проверял на разных объемах данных, и с сотней строк, и с сотней тысяч. В исторической таблице на один item_id приходится от 1 до пары десятков значений, в среднем их количество около 5-6.
Время разное, но соотношение примерно сохраняется — первый запрос выполняется в несколько раз быстрее, чем второй.
ArtNick
Дата: 16.09.2015 14:47:27
Alibek B.
Мне нужно узнать действующее значение на произвольную дату, которую я заранее не знаю.
Если будет составной индекс (item_id,date_beg), он будет задействован при джойне?

запрос напиши, о котором идет речь.
Почему ты выбрал date_beg если в примерах используешь sysdate? почитай тут