Описывает фактические алгоритмы, которые сервер использует для получения ваших данных.
SQL
запрос, подобный следующему:
SELECT *
FROM mytable1
JOIN mytable2
ON …
GROUP BY
…
ORDER BY
…
, описывает , что должно быть сделано, но не , как это должно быть сделано.
План выполнения показывает как : какие индексы используются, какие методы объединения выбираются (вложенные циклы или хеш-соединение или объединение слиянием), как группируются результаты (с помощью сортировки или хэширования), как они заказаны и т. д.
К сожалению, даже современные SQL
движки не могут автоматически находить оптимальные планы для более или менее сложных запросов, все равно требуется SQL
разработчик, чтобы переформулировать запросы так, чтобы они выполнялись (даже если они делают то, что делает исходный запрос) ).
Классическим примером были бы такие запросы:
SELECT (
SELECT COUNT(*)
FROM mytable mi
WHERE mi.id <= mo.id
)
FROM mytable mo
ORDER BY
id
и
SELECT RANK() OVER (ORDER BY id)
FROM mytable
, которые делают то же самое и теоретически должны выполняться с использованием тех же алгоритмов.
Однако ни один из реальных движков не оптимизирует предыдущий запрос для реализации тех же алгоритмов, т.е. е. сохранить счетчик в переменной и увеличить его.
Он будет делать то, что ему велено: подсчитывать строки снова и снова.
Чтобы оптимизировать запросы, вам нужно реально увидеть, что происходит за кулисами, и именно это показывают планы выполнения.
Возможно, вы захотите прочитать эту статью в моем блоге: