Почему делает запрос с меньше стоимости подвыбора, чем запрос с константой в Oracle

У меня есть таблица SQL с некоторым миллионом записей, и я пытался запросить, насколько записи являются более старыми, чем 60 дней (Oracle 11.2.0.1.0).

Для этого эксперимента я использовал 3 различных версии избранного оператора:
(Величина затрат дана ЖАБОЙ для Oracle V. 9.7.2.5),

  1. select count(*) from fman_file
    where dateadded >= (select sysdate - 60 from dual)

    Стоимость: 65

  2. select count(*) from fman_file
    where dateadded >= sysdate - 60

    Стоимость: 1909

  3. select count(*) from fman_file
    where dateadded >= sysdate - numtodsinterval(60,'day')

    Стоимость: 1884

  4. select count(*) from fman_file where dateadded >= '10.10.2009'
    Стоимость: 1823
    (Эти 10.10.2009 являются просто датой в качестве примера!!!)

У меня нет точных временных стоимостей для всех запросов в памяти, но первый действительно был самым быстрым.

Таким образом, я попробовал еще некоторые запросы Select другими подвыборами (как (Выберите 1000 из двойного)) и они были (иногда ПУТЬ) быстрее, чем другие с постоянными величинами. Даже кажется, что этот "БЕЗОТНОСИТЕЛЬНО" (Ошибки/Функции) происходит в MySQL также.

Таким образом, кто-либо может сказать мне, почему первый запрос (путь) быстрее что другие?

Greetz

P.S.: Это не о sydate! Вопрос состоит в том, ПОЧЕМУ ИЗМЕНЕНИЕ С (Выбором) БЫСТРЕЕ, ЧЕМ ДРУГИЕ? (с небольшим вниманием на Избранное Изменение (1). по сравнению с Постоянным изменением (4.))

6
задан Husky110 8 July 2010 в 09:21
поделиться

4 ответа

Tom Kyte:

Преимущество дуала в том, что оптимизатор понимает, что дуал - это специальная таблица с одной строкой, одним столбцов - когда вы используете его в запросах, он использует это знание при разработке план.

1
ответ дан 17 December 2019 в 07:00
поделиться

Нашел некоторые подсказки в моей копии "Cost-Based Oracle Fundamentals" Джонатана Льюиса в главе 6 "surprising sysdate". Похоже, это относится к 9i, возможно, и к более поздним версиям.

Оптимизатор рассматривает sysdate (и trunc(sysdate) и несколько других функций от sysdate) как известные константы во время разбора, но sysdate + N становится неизвестной и получает такое же обращение, как переменная привязки - что означает фиксированную 5% селективность. (Заметим, в частности, что sysdate + 0 даст отличную от sysdate кардинальность.)

Очевидно, оптимизатор также распознает select sysdate from dual как известную константу.

3
ответ дан 17 December 2019 в 07:00
поделиться

Вы можете попробовать использовать План объяснения . Это покажет вам, что делают запросы и различия между ними.

Пара ссылок для настройки и использования плана объяснения:

http://download.oracle.com/docs/cd/B10500_01/server.920/a96533/ex_plan.htm

http: // www .adp-gmbh.ch / ora / manageplan.html

0
ответ дан 17 December 2019 в 07:00
поделиться

Вы повторно попробовали числа 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 -- но вы поняли идею.

0
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: