Как оптимизировать Oracle-запрос из секционированной таблицы? - PullRequest
2 голосов
/ 17 августа 2011

У меня есть секционированная таблица по дате (по дням) и локальный индекс по полям (включая поле даты). Если я сделаю запрос:

SELECT * FROM table t WHERE t.fdate = '30 .06.2011 '

выполняется быстро, но когда я делаю

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ t ГДЕ ВЫДЕРЖКА (месяц от t.fdate) = 6 И ЭКСТРАКТ (год от даты t.fdate) = 2011

выполняется примерно 200 секунд.

Как оптимизировать этот запрос? Может быть мне нужно создать локальный индекс по ЭКСТРАКТУ (месяц от даты) И ЭКСТРАКТУ (год от даты)?

1 Ответ

6 голосов
/ 17 августа 2011

Поскольку у вас есть индекс в поле даты, вы должны написать свой запрос таким образом, чтобы этот индекс можно было использовать. Это невозможно с функциями EXTRACT, поскольку Oracle должен просмотреть все данные и вычислить условие для каждой строки, чтобы определить, соответствует ли оно.

Индекс даты можно использовать, если у вас есть конкретная дата или диапазон дат. В вашем случае вы ищете диапазон дат. Таким образом, запрос может быть записан как:

SELECT * FROM TABLE T
WHERE T.FDATE BETWEEN TO_DATE('1.6.2011', 'DD.MM.YYYY') AND TO_DATE('30.6.2011', 'DD.MM.YYYY');
...