Ситуация
Ты – DBA сервиса schetovod, это бухгалтерия для небольших компаний. Месячная сводка по счетам строится десятки секунд. Менеджеры ждут не молча: жмут кнопку еще раз, потом еще, и параллельные тяжелые запросы добивают базу окончательно.
Что известно:
- отчетный запрос –
/opt/schetovod/report.sql; разработчик отчетов стоит на своем: запрос идеальный, тормозит база. Текст запроса менять нельзя – на него завязан экспорт в 1С; - база – PostgreSQL:
psql -U postgres -d schetovod; в таблицеentries– три миллиона проводок; - витрина отчета – вкладка Браузер (:8000): кнопка Сформировать отчет показывает, сколько он строился;
- тикет поддержки –
/root/ticket-2214.txt; - цифры отчета измениться не должны – их сверяет бухгалтерия.
Дальше – сам: найди, куда уходят секунды, и ускорь отчет на порядок средствами базы.
Что проверим
5 пунктов · по состоянию системы, а не по командам
Найти, куда уходят секунды
Снимите план запроса и найдите узкое место: что именно база делает эти десятки секунд.
Ускорить запрос средствами базы
Уложите отчет быстрее 2 секунд, не меняя текст запроса и не трогая данные – цифры сверяет бухгалтерия.
Пережить F5-шторм
Оба коррелированных подзапроса должны использовать подходящий постоянный индекс, а не возвращаться к полному сканированию entries.
