У меня есть таблица SQL с некоторым миллионом записей, и я пытался запросить, насколько записи являются более старыми, чем 60 дней (Oracle 11.2.0.1.0).
Для этого эксперимента я использовал 3 различных версии избранного оператора:
(Величина затрат дана ЖАБОЙ для Oracle V. 9.7.2.5),
select count(*) from fman_file
where dateadded >= (select sysdate - 60 from dual)
Стоимость: 65
select count(*) from fman_file
where dateadded >= sysdate - 60
Стоимость: 1909
select count(*) from fman_file
where dateadded >= sysdate - numtodsinterval(60,'day')
Стоимость: 1884
select count(*) from fman_file where dateadded >= '10.10.2009'
Стоимость: 1823
(Эти 10.10.2009 являются просто датой в качестве примера!!!)
У меня нет точных временных стоимостей для всех запросов в памяти, но первый действительно был самым быстрым.
Таким образом, я попробовал еще некоторые запросы Select другими подвыборами (как (Выберите 1000 из двойного)) и они были (иногда ПУТЬ) быстрее, чем другие с постоянными величинами. Даже кажется, что этот "БЕЗОТНОСИТЕЛЬНО" (Ошибки/Функции) происходит в MySQL также.
Таким образом, кто-либо может сказать мне, почему первый запрос (путь) быстрее что другие?
Greetz
P.S.: Это не о sydate! Вопрос состоит в том, ПОЧЕМУ ИЗМЕНЕНИЕ С (Выбором) БЫСТРЕЕ, ЧЕМ ДРУГИЕ? (с небольшим вниманием на Избранное Изменение (1). по сравнению с Постоянным изменением (4.))
Преимущество дуала в том, что оптимизатор понимает, что дуал - это специальная таблица с одной строкой, одним столбцов - когда вы используете его в запросах, он использует это знание при разработке план.
Нашел некоторые подсказки в моей копии "Cost-Based Oracle Fundamentals" Джонатана Льюиса в главе 6 "surprising sysdate". Похоже, это относится к 9i, возможно, и к более поздним версиям.
Оптимизатор рассматривает sysdate (и trunc(sysdate) и несколько других функций от sysdate) как известные константы во время разбора, но sysdate + N становится неизвестной и получает такое же обращение, как переменная привязки - что означает фиксированную 5% селективность. (Заметим, в частности, что sysdate + 0 даст отличную от sysdate кардинальность.)
Очевидно, оптимизатор также распознает select sysdate from dual
как известную константу.
Вы можете попробовать использовать План объяснения
. Это покажет вам, что делают запросы и различия между ними.
Пара ссылок для настройки и использования плана объяснения:
http://download.oracle.com/docs/cd/B10500_01/server.920/a96533/ex_plan.htm
Вы повторно попробовали числа 2-4 с () вокруг вычисления после >= - мне кажется, что первый оператор единственный, где он вычисляет это значение один раз - для всех остальных он пересчитывает каждую строку. Например:
select count(*) from fman_file where dateadded >= (SELECT sysdate - 60)
select count(*) from fman_file where dateadded >= (SELECT (sysdate - numtodsinterval(60,'day'))
select count(*) from fman_file where dateadded >= (SELECT CONVERT(datetime,'10.10.2009'))
NB -- не знаю синтаксиса для преобразования в дату в Oracle -- но вы поняли идею.