Unit of Work отслеживает новые, изменённые и удалённые ORM-объекты и отправляет их изменения при flush. commit завершает транзакцию, но SQL может выполняться значительно раньше.
Django ORM тесно интегрирована с моделями, миграциями и остальным Django. SQLAlchemy — самостоятельный SQL toolkit и ORM с явной Session и моделью Unit of Work.
async/await позволяет не занимать поток ожиданием ответа БД и обслуживать другие задачи, если драйвер действительно асинхронный. Сам SQL-запрос от этого не становится быстрее.
Сначала измерьте ожидание выдачи соединения, число занятых и свободных соединений, очередь и таймауты именно в пуле приложения или PgBouncer. pg_stat_activity показывает серверные сессии, а не всю очередь пула.
wal_compression в PostgreSQL сжимает прежде всего полные образы страниц в WAL, а не произвольный WAL-файл целиком. Это уменьшает объём записи и передачи ценой дополнительной работы CPU.
Сначала измерьте число и длительность SQL-запросов, затем устраните подтверждённый N+1 через подходящую загрузку связей. Кеширование не должно маскировать необъяснённую дорогую выборку.
Для LSM-хранилищ write amplification часто создают compaction, индексы и повторная запись больших значений. Снижать его нужно через модель данных и настройки движка, измеряя компромисс с чтением и местом.
Да, проектирование начинается с сущностей, инвариантов и запросов, а не сразу с перечня индексов. На интервью лучше предложить порядок работы и показать небольшой пример.
Проверьте реальные строки и повторения узлов, методы сканирования и соединения, сортировки, временные файлы и buffers. Главная цель — найти, где план выполняет лишнюю работу.
Смотрите расхождение estimated и actual rows, время, loops, способ доступа и JOIN, сортировки, spills и buffers. Большая стоимость узла не равна измеренному времени выполнения.
UPDATE берёт табличную блокировку ROW EXCLUSIVE и блокирует затронутые строки, но это не запрет всех обращений к таблице. Обычные SELECT и изменения независимых строк обычно продолжаются.