Если работаешь с данными, наверняка слышал эти страшные слова про план запроса и что вообще надо бы уметь его читать ‼️
А может тебя уже спрашивали про физические джойны на собесах и вообще просили прикинуть сложность алгоритма?? 😨
До физических джойнов и сложности алгоритмов мы еще доберемся, а сегодня про план запроса и что же это вообще такое?
🔍План запроса — это то как СУБД выполняет твой SQL запрос.
Рассмотрим на примере Greenplum/PostgreSQL.
1️⃣ Чтобы посмотреть план запроса нужно в начале запроса добавить
EXPLAIN - показывает оценочный план: cost/rows/width. Cost — это не миллисекунды, а абстрактные единицы.
EXPLAIN ANALYZE - выполняет запрос и показывает фактическое время, полученные строки.
EXPLAIN (ANALYZE, VERBOSE, BUFFERS, FORMAT JSON) <твой SELECT>😮Говоря простым языком, EXPLAIN это когда ты открыл рецепт и думаешь что сделаешь все по нему, а EXPLAIN ANALYZE это когда уже начал готовить и понял что и конфорка только одна, и продукты вообще то дома закончились, да и вообще у тебя сковородки нет.
2️⃣ Глобально можно выделить следующие операции в плане запроса (они даже кажутся логичными⁉️):
➡️ Scan — как читаем (Seq/Index/Bitmap); тут часто срабатывают фильтры.
➡️ Join — как соединяем данные (Hash/Merge/Nested Loop).
➡️Sort/Agg — сортировки, группировки, окна.
➡️ Motion (только в MPP/GP) — перемещения: Gather / Redistribute / Broadcast.
➡️ спиллы на диск (workfiles) — сброс на диск при нехватке памяти под sort/hash.
3️⃣Как читать?
➡️Смотри на узлы с самым большим actual time.
➡️ Сравни оценочные rows vs фактические — где расхождение, там и проблема со статистикой/кардинальностью.
➡️Отлови Motion-узлы (узкие горлышки в GP).
➡️Проверь, нет ли Nested Loop на больших объёмах.
➡️Загляни в Sort/Hash — были ли спиллы?
✍️ Что рекомендую ❔
🟢 изучить цикл статей про Postgresql от Тензора, все презентации доступны на гитхабе.
🟢Обязательно посмотри планы запроса на сайте от Тензора, они не просто объяснят что делать, но еще и отправят в документацию и покажут видео — https://explain.tensor.ru/archive/
🟢Конечно активно использовать ИИ, для того чтобы он объяснил что происходит в твоем плане (будь аккуратен и перепроверяй его рекомендации по оптимизации, он порой чудит).
🤪В отдельном посте сделаю подробный разбор реального плана GP/PG: пройдёмся по узлам, покажу, где теряется время и как это чинить.
🙈Нужен ваш фидбэк!
Напишите в комментах:
— Что больше всего пугает в планах?
— Где чаще всего “спотыкаетесь”: оценка строк, Motion, сортировки, join’ы?
— Что из этого разобрать в первую очередь?
@etl_kitchen
