У меня есть большой стол Oracle с индексированной дата_время поле: «DISCONNECT_DATE»Как использовать Oracle индексированного поля в запросе
Когда я использую следующую команду, где пункт мой запрос выполняется быстро:
DISCONNECT_DATE > TO_DATE('01-DEC-2016', 'DD-MON-YYYY') AND
DISCONNECT_DATE < TO_DATE('01-JAN-2017', 'DD-MON-YYYY')
Когда я использую следующий пункт, где мой запрос работает (очень) медленно:
extract(month from disconnect_date) = '12' and
extract(year from disconnect_date) = '2016'
Они являются более или менее эквивалентны в своих намерениях. Почему первые работают, а позже нет? (Я не думаю, что эта проблема в SQL SERVER)
(я использую PL SQL Developer, чтобы написать запрос)
Я полагаю, что Oracle не может автоматически преобразовать ваш второй вариант в первый вариант, поэтому он полностью сканирует. Для этой оптимизации понадобится специальный случай. PS. Они не эквивалентны, если вы не измените> на> = –
Я смущен. Вы говорите, что в SQL Server обе версии работают очень быстро? Я ничего не знаю о SQL Server, но я бы нашел это очень удивительным. (Если у вас уже есть функциональные индексы в SQL Server, как показывает Гордон в его ответе.) – mathguy