Порядок оценки SQL-предложений Oracle - PullRequest
4 голосов
/ 16 мая 2010

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

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

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

Ответы [ 5 ]

4 голосов
/ 16 мая 2010

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

SELECT foo+bar foobar FROM table1 ORDER BY foobar

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

  • FROM
  • ГДЕ
  • GROUP BY
  • SELECT
  • HAVING
  • ЗАКАЗАТЬ НА

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

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

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

3 голосов
/ 02 декабря 2016

Порядок обработки запросов Oracle

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

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

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

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

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

2 голосов
/ 23 марта 2017

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

  1. FROM
  2. CONNECT BY
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. ORDER BY
0 голосов
/ 17 августа 2018

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

  1. ОТ
  2. ON
  3. JOIN
  4. ГДЕ
  5. GROUP BY
  6. С КУБОМ или С РОЛЛАПОМ
  7. ЕСТЬ
  8. SELECT
  9. DISTINCT
  10. ЗАКАЗАТЬ ПО

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

Ссылки

Microsoft T-SQL
Блог Oracle

...