Порядок оценки SQL-предложений Oracle

В Oracle, какие типы предложений оцениваются первыми? Если бы у меня было следующее (притвориться.... представляющие допустимые выражения и имена отношений), каков был бы порядок оценки?

SELECT   ...
FROM     .....
WHERE    ........
GROUP BY ...........
HAVING   .............
ORDER BY ................

У меня сложилось впечатление, что предложение SELECT оценивается последним, но кроме этого я ничего не понимаю.

5 ответов

Решение

Список выбора не всегда может быть оценен последним, потому что ORDER BY может использовать псевдонимы, которые определены в списке выбора, поэтому они должны выполняться позже. Например:

SELECT foo+bar foobar FROM table1 ORDER BY foobar

Я бы сказал, что в общем порядке выполнения может быть что-то вроде этого:

  • ОТ
  • ГДЕ
  • ГРУППА ПО
  • ВЫБРАТЬ
  • HAVING
  • СОРТИРОВАТЬ ПО

Предложения GROUP BY и WHERE можно поменять местами без изменения результата, равно как и HAVING и ORDER BY.

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

Также обратите внимание, что если для предложения ORDER BY выбран индекс, строки могут быть уже в правильном порядке при чтении с диска. В этом случае предложение ORDER BY действительно не выполняется вообще.

Oracle Query Processing Order

  • ОТ условия
  • ГДЕ оговорка
  • Предложение GROUP BY
  • HAVING пункт
  • Предложение SELECT
  • Предложение ORDER BY

Вот для чего нужны планы выполнения. Но, как правило, есть только 1 способ сделать это. Я проигнорирую оптимизации на данный момент:

  • ОТ, чтобы вовлечь стол
  • Начните сканирование таблицы в FROM, оставив те, которые проходят предложение WHERE
  • ВЫБЕРИТЕ неагрегированные столбцы
  • Рассчитать агрегированные столбцы с помощью GROUP BY
  • Сохраните те сгруппированные результаты, которые проходят предложение HAVING
  • результаты заказа с ORDER BY

Оптимизация может привести к тому, что некоторые "подсмотрители" примут более правильные решения (например, было бы неплохо проверить предложение WHERE перед сканированием таблицы - индекс может быть доступен).

Я полагаю, что большинство СУБД решают эту проблему с помощью предварительного прохождения через оптимизатор, который в основном переписывает запрос, чтобы использовать преимущества индексов, удалять избыточные выражения и т. Д. Этот оптимизированный запрос затем используется для фактического построения плана выполнения. Есть также параллелизм, который может изменить специфику - но основы те же.

Ниже приведен порядок обработки SQL-запросов:

  1. FROM
  2. CONNECT BY
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. ORDER BY

Порядок логической обработки SELECT заявление

  1. ОТ
  2. НА
  3. ПРИСОЕДИНИТЬСЯ
  4. ГДЕ
  5. ГРУППА ПО
  6. С КУБОМ или С РОЛЛУПОМ
  7. HAVING
  8. ВЫБРАТЬ
  9. DISTINCT
  10. СОРТИРОВАТЬ ПО

Это логический порядок, который будет использоваться при написании /(логически продуманном) запроса. База данных может оптимизировать запрос различными способами во время фактического выполнения для эффективности, если возвращаемые результаты такие же, как если бы он следовал этому порядку выполнения.

Рекомендации

Microsoft T-SQL
Блог Oracle

Другие вопросы по тегам