Совет дня №11
Если вы работаете с базой, то должны видеть все запросы, которые в нее идут. Это абсолютно обязательное условие. В особой степени оно касается ORM. Когда я делаю ревью, и в коде используются абстракции над базой, то всегда спрашиваю: какие запросы производит этот код? При этом ожидаю не гадание, а лог терминала, приложенный PR.
Увидеть запросы можно следующим образом. Если Postgres запущен в Докере,
передайте в command ключ -E:
services:
postgres:
image: postgres:17
command: -E
Если это ванильный Postgres, включите логирование всех запросов опцией:
log_statement = 'all'
После этого лог отслеживают командой tail:
tail -f '/var/log/postgresql.log'
Расположение лога зависит от операционной системы и менеджера пакетов.
Третий способ — настроить логирование в приложении. Скажем, в Джанго все
операции с базой идут в логгер django.db.backends. Нужно выставить ему уровень
INFO и направить в консоль.
Минус такого логирования в том, что оно учитывает только свои запросы. Если кто-то ходит в базу минуя ORM, этих запросов вы не увидите.
С другой стороны, мы перекладываем бремя логирования с базы на приложение. База одна, и если логировать каждый запрос, это замедлит ее. А поскольку узлов приложения много, на них это не скажется.
Вместе с запросами полезно логировать время их выполнения. Заведите дашбоард, который находит топ-100 медленных запросов. Раз в месяц заводите задачу на оптимизацию.
Расширение pg_stat_statements (доступно из коробки) ведет статистику запросов:
число вызовов, среднее, минимальное и максимальное времена, размер переданных
строк и так далее. Очень помогает на проде.
Если вы не видите, какие запросы идут в базу, разработка подобна блужданию в темноте.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter