Уведомления
Очистить всё

Заявка: 15 минут про EXPLAIN ANALYZE для тех, кто его боится

5 Сообщения
4 Пользователи
4 Реакции
551 Просмотры
kostya.sokurov
Сообщения: 73
Автор темы
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад
[#17]

Предлагаю на майскую встречу короткий доклад: как читать EXPLAIN ANALYZE и не пугаться. Без теории планировщика, на одном запросе из типичного Rails-приложения: список заказов с фильтром по статусу и сортировкой по дате. Покажу, где в плане смотреть реальное время, rows и loops, откуда берётся Seq Scan и что меняется после составного индекса. Примерно так:

EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders
WHERE status = 'paid'
ORDER BY created_at DESC
LIMIT 50;

И пару минут про то, как получить план прямо из консоли Rails, чтобы не копировать SQL из лога руками. Отпишитесь, кому было бы полезно, хочу понять уровень: совсем с нуля или планы уже видели.


4 ответа
viktor.petrov
Сообщения: 26
Читает чужие PR бэкенд-разработчик
Присоединился: 4 года назад

Записал первым докладом на 25 мая. 15 минут плюс вопросы, проектор в зале есть


Ответ
Валерий40
Сообщения: 33
Читает чужие PR фулстек-разработчик
Присоединился: 4 года назад

Очень надо. Я восемь лет писал на Laravel и планы смотрел пару раз в жизни, когда всё уже горело. Вывести SQL я умею, а читать план меня никто не учил. Если покажете, как понять, что индекс вообще используется, уже польза.


Ответ
Ксения 90
Сообщения: 18
Пишет тесты QA-автоматизатор
Присоединился: 4 года назад

А можно ещё про то, почему на тестовой базе с сотней строк план один, а на проде другой? Вечная история «а локально же быстро»


Ответ
kostya.sokurov
Сообщения: 73
Автор темы
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад

Рассказал, спасибо всем, кто пришёл. Вопрос Ксении про маленькую базу оказался самым популярным, разобрали подробно: на сотне строк планировщику дешевле прочитать всю таблицу, чем идти в индекс, поэтому Seq Scan локально нормален и ничего не говорит о проде. Чтобы увидеть настоящий план, нужна база с похожим объёмом и свежий ANALYZE. Из консоли показывал вот так:

Order.where(status: "paid").order(created_at: :desc).limit(50).explain

В 7.0 это обычный EXPLAIN без ANALYZE, за реальным временем всё равно идём в psql. Про чтение планов хорошо написано в документации: https://www.postgresql.org/docs/current/using-explain.html. Вышли за время минут на десять, следующему докладу это не помешало, потому что его не было)


Ответ