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

Если я работаю с PostgreSQL, то включаю логирование всех выражений. В Докере это делается передачей параметра -E как в примере ниже:

version: "3.6"
services:
  postgres:
    image: postgres:14
    command: -E

С ним все запросы видны в терминале, где запущен Докер.

Если база работает нативно, в файлик postgresql.conf добавляю выражение:

log_statement = 'all'

Оно там есть из коробки, но закомментировано. В отдельной вкладке вызываю вечный tail:

> tail -f '/path/to/postgresql.log'

Далее я пишу код, гоняю тесты и посматриваю логи. Зачем? Потому что за много лет я выявил столько чуши, что просто не описать. Например:

  • запросы WHERE ID IN на тысячи айдишников;

  • группировка по всем(!) полям таблицы: GROUP BY id, name, email, etc...;

  • молчаливый откат транзакции без выброса исключения. Запрос упал, но разработчик молча идет дальше;

  • изменения без транзакции там, где она должна быть;

  • мусорные запросы в pg_catalog и другие служебные таблицы, потому что какие-то свойства не заданы в коде;

  • чтение записей поштучно по ID в цикле (200, 500 шагов и больше);

  • просто всякие дикие конструкции.

Все это я собираю и открывают тикеты. Некоторые даже удается исправить.

Лог базы — своего рода осиное гнездо. Открой его — и почти наверняка уйдешь в ступор от того, какую дичь генерит ORM или “умная” библиотека. Или разработчик, вооруженный всем этим добром.

Так и живем.