Предлагаю на майскую встречу короткий доклад: как читать 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 из лога руками. Отпишитесь, кому было бы полезно, хочу понять уровень: совсем с нуля или планы уже видели.
Записал первым докладом на 25 мая. 15 минут плюс вопросы, проектор в зале есть
Очень надо. Я восемь лет писал на Laravel и планы смотрел пару раз в жизни, когда всё уже горело. Вывести SQL я умею, а читать план меня никто не учил. Если покажете, как понять, что индекс вообще используется, уже польза.
А можно ещё про то, почему на тестовой базе с сотней строк план один, а на проде другой? Вечная история «а локально же быстро»
Рассказал, спасибо всем, кто пришёл. Вопрос Ксении про маленькую базу оказался самым популярным, разобрали подробно: на сотне строк планировщику дешевле прочитать всю таблицу, чем идти в индекс, поэтому 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. Вышли за время минут на десять, следующему докладу это не помешало, потому что его не было)