Если вы работаете с базой, то должны видеть все запросы, которые в нее идут. Это абсолютно обязательное условие. В особой степени оно касается 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 (доступно из коробки) ведет статистику запросов: число вызовов, среднее, минимальное и максимальное времена, размер переданных строк и так далее. Очень помогает на проде.

Если вы не видите, какие запросы идут в базу, разработка подобна блужданию в темноте.