пятница, 10 мая 2013 г.

Функциональный индекс - индекс по части таблицы

С ростом данных в таблице растет и размер индексов, что приводит к замедлению выполнения запросов даже по индексу.
Если данные нужны не целиком, а только часть, то можно создать индекс по части таблицы или функциональный индекс.

К примеру, у нас есть таблица с историей продаж, но данные нам нужны только за последний месяц. В этом случае можно создать индекс:
CREATE INDEX retail.xif_rtl_sale_history_fnc ON retail.rtl_sale_history
  (
    CASE WHEN OPER_DATE > TO_DATE('01.04.2013','dd.mm.yyyy') THEN OPER_DATE END DESC,
    nmcl_id                         ASC
  )
  TABLESPACE  indx
/

Данный индекс будет иметь данные только по части таблицы: номенклатура и дата продажи с 01.04.2013. Остальные данные не попадут в выборку и запросы по этому индексу будут выполняться значительно быстрей, чем по обычному индексу.

В этом индексе сразу видно большой минус - нельзя использовать SYSDATE в логике функционального индекса из-за его размер будет расти и его нужно будет раз в некоторое время перенастраивать на новую дату.

Также, чтобы индекс правильно использовался, фильтр "CASE WHEN OPER_DATE > TO_DATE('01.04.2013','dd.mm.yyyy') THEN OPER_DATE END" в точном соответствии нужно добавить в запрос.