Индексы по функциям 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. Теперь смело создаем индекс на нашу функцию, где прописываем формат в котором дата лежит в таблице.
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. Смотрим план запроса. Заметим что индекс сработал. На рисунке он выделен желтым
Добавлю, для того чтобы наш индекс сработал в запрос, необходимо при написании запроса учитывать регистр букв, он должен быть такой же как в созданном индексе.
Надеюсь моя статья окажется полезной.
Синтаксис следующий:
CREATE INDEX Имя_Индекса ON Имя_таблицы
(LPAD("Имя_столбца,5,'0'))
Часто бывают случаи (например при загрузке данных из файлов xml, txt и других) когда дата в таблице лежит в текстовом формате наряду с остальной текстовой информацией. При больших объемах во время сортировки таких данных, поиска по дате могут возникнуть трудности со скоростью выполнения запросов.
Примечательно что индекс по функции TO_DATE в субд oracle создать нельзя. Причина этого - дата варьируется в зависимости от TIMEZONE установленной сессией. Но если (как в моем случае) вы пишите приложение для конкретного предприятия, которое не имеет разбросанных филиалов, то этим ограничением можно пренебречь и закэшировать дату. Делается это следующим образом:
1. Для начала необходимо создать нестандартную функцию преобразования TO_DATE которая будет содержать волшебное слово DETERMINISTIC.
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. Теперь напишем запрос, использующий наш индекс. Для достоверности отойду от условных названий и сделаю запрос к реальной таблице.("TO_DATE_FNC"("Имя_столбца",'dd.mm.rrrr hh24:mi:ss'))
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. Смотрим план запроса. Заметим что индекс сработал. На рисунке он выделен желтым
Добавлю, для того чтобы наш индекс сработал в запрос, необходимо при написании запроса учитывать регистр букв, он должен быть такой же как в созданном индексе.
Надеюсь моя статья окажется полезной.
Комментариев нет:
Отправить комментарий