🗄️database / postgresql

Последовательное сканирование 67 млн строк PostgreSQL

junior15 min🏢 Fintech startup (daily financial reporting)
PostgreSQLEXPLAIN ANALYZEIndexSlow Querypg_stat_user_tables

Стек технологий

  • PostgreSQL 15
  • Python 3.11
  • SQLAlchemy
  • Celery
  • Redis
🚨

Сценарий инцидента

Ежедневный финансовый отчёт всегда запускался в 03:00 UTC и завершался менее чем за минуту.
Сегодня утром он работал 47 минут и упал по таймауту. За последние 2 недели код не деплоился.
Отчёт охватывает все завершённые заказы за текущий год.
Ваш DBA в отпуске. Найдите причину и устраните без даунтайма.

🔍 Артефакты расследования

Раскрывай артефакты один за другим. Каждая улика приближает тебя к корневой причине.

📋
Улика #1 · log
Лог медленных запросов
💡 Обратите внимание на структуру запроса — какие колонки используются в WHERE и JOIN?
🔍
Улика #2 · query
Вывод EXPLAIN ANALYZE
💡 Ищите "Seq Scan" — сканирует ли он всю таблицу или использует индекс?
🔍
Улика #3 · query
Статистика таблиц и инвентаризация индексов
💡 Какие индексы есть на таблице orders? Как изменилось количество строк за 6 месяцев?
🔍
Улика #4 · query
Исправление: создание индекса и проверка
💡 Как добавить индекс на таблицу с 67 млн строк без её блокировки?