Порядок оценки 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-запросов:
FROM
CONNECT BY
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
Порядок логической обработки SELECT
заявление
- ОТ
- НА
- ПРИСОЕДИНИТЬСЯ
- ГДЕ
- ГРУППА ПО
- С КУБОМ или С РОЛЛУПОМ
- HAVING
- ВЫБРАТЬ
- DISTINCT
- СОРТИРОВАТЬ ПО
Это логический порядок, который будет использоваться при написании /(логически продуманном) запроса. База данных может оптимизировать запрос различными способами во время фактического выполнения для эффективности, если возвращаемые результаты такие же, как если бы он следовал этому порядку выполнения.
Рекомендации