воскресенье, 13 апреля 2014 г.

Создать индекс таблицы oracle по функции TO_DATE

Индексы  по функциям oracle довольно старая функциональность, пришедшая в мир с восьмой версией субд oracle. Поэтому не буду особо заострять внимание на этом. Скажу лишь что индексы по функциям порой могут пригодится, если необходимо ускорить выполнение программы без изменения запросов и таблиц.
Синтаксис следующий:

CREATE INDEX Имя_Индекса ON Имя_таблицы
(LPAD("Имя_столбца,5,'0'))

Часто бывают случаи (например при загрузке данных из файлов xml, txt и других) когда дата в таблице лежит в текстовом формате наряду с остальной текстовой информацией. При больших объемах во время сортировки таких данных, поиска по дате  могут возникнуть трудности со скоростью выполнения запросов.
Примечательно что индекс по функции TO_DATE в субд oracle создать нельзя. Причина этого - дата варьируется в зависимости от TIMEZONE установленной сессией. Но если (как в моем случае) вы пишите приложение для конкретного предприятия, которое не имеет разбросанных филиалов, то этим ограничением можно пренебречь и закэшировать дату. Делается это следующим образом:
1. Для начала необходимо создать нестандартную функцию преобразования TO_DATE которая будет содержать волшебное слово DETERMINISTIC.
TO_DATE_FNC(p_date   VARCHAR , p_date_format VARCHAR)
return date
DETERMINISTIC
is
begin
return TO_DATE(p_date, p_date_format);
end;

2. Теперь смело создаем индекс на нашу функцию, где прописываем формат в котором дата лежит в таблице.
CREATE INDEX Имя_индекса ON Имя_таблицы
("TO_DATE_FNC"("Имя_столбца",'dd.mm.rrrr hh24:mi:ss'))
3. Теперь напишем запрос, использующий наш индекс. Для достоверности отойду от условных названий и сделаю запрос к реальной таблице.
select * from XX_ETW.DISLOCATION_CARS where "XX_BI"."TO_DATE_FNC"("DATA_OPERACII",'dd.mm.rrrr hh24:mi:ss') between sysdate-5 and sysdate
4. Смотрим план запроса. Заметим что индекс сработал. На рисунке он выделен желтым


Добавлю, для того чтобы наш индекс сработал в запрос, необходимо при написании запроса учитывать регистр букв, он должен быть такой же как в созданном индексе.

Надеюсь моя статья окажется полезной.

Комментариев нет:

Отправить комментарий