Расскажите про опыт работы с PostgreSQL
Что проверяют
Работаете ли вы с базой осознанно или только через методы библиотеки. Для Node отдельно смотрят пул соединений и транзакции: там живут ошибки, незаметные при разработке и проявляющиеся под нагрузкой.
Как отвечать
Идите от задач, которые решали.
- схема: типы, ограничения, внешние ключи, почему выбрана такая нормализация, где сознательно денормализовали;
- запросы: чтение плана через
EXPLAIN (ANALYZE, BUFFERS), разница между полным сканированием и обращением по индексу, расхождение оценки строк с фактом; - индексы: составные и порядок колонок в них, частичный индекс под конкретный фильтр, цена индекса при записи;
- транзакции: уровень изоляции по умолчанию, блокировки,
SELECT ... FOR UPDATE, вставка черезON CONFLICT DO UPDATEвместо связки чтения и записи; - эксплуатация: миграции отдельным шагом деплоя, создание индекса без блокировки записи, таймаут на запрос.
Специфика Node в том, что работа идёт через пул, и транзакция обязана целиком уложиться в одно соединение:
const client = await pool.connect();
try {
await client.query("BEGIN");
await client.query("UPDATE accounts SET balance = balance - $1 WHERE id = $2", [amount, id]);
await client.query("COMMIT");
} catch (err) {
await client.query("ROLLBACK");
throw err;
} finally {
client.release();
}Где спотыкаются
Открывают транзакцию прямо на пуле, а не на взятом соединении. Запросы расходятся по разным соединениям, начало транзакции не оборачивает ничего, и данные расползаются только под нагрузкой, когда соединений в пуле не хватает.
Второе: обещают навесить индексы на все часто используемые поля. Каждый индекс оплачивается скоростью записи и местом, не применяется при вычислении над колонкой и бесполезен, если в составном индексе перепутан порядок колонок. Аргумент это план запроса, а не количество индексов.
Третье: живут внутри библиотеки доступа к данным. Ленивые связи дают запрос на каждую строку, выборка без ограничения тянет всю таблицу в память процесса, а итоговый SQL никто не смотрел. Умение включить лог запросов и прочитать план отличает разработчика от пользователя библиотеки.