Многие приложения делают
UPDATE даже тогда, когда данные вообще не изменились.UPDATE users
SET name = 'Alex'
WHERE id = 1;
Даже если
name уже равен 'Alex', PostgreSQL всё равно создаст новую версию строки (MVCC), запишет WAL, обновит индексы и увеличит нагрузку на autovacuum.Проверить это можно через системную статистику:
SELECT n_tup_upd
FROM pg_stat_user_tables
WHERE relname = 'users';
Чтобы избежать “пустых”
UPDATE, можно сравнивать старые и новые значения прямо в WHERE:UPDATE users
SET
name = $1,
email = $2
WHERE id = $3
AND (name, email) IS DISTINCT FROM ($1, $2);
IS DISTINCT FROM безопасно сравнивает даже NULL значения, в отличие от обычного !=:SELECT
NULL = NULL,
NULL IS DISTINCT FROM NULL;
На highload-системах это может заметно уменьшить
WAL, bloat, количество HOT/non-HOT update и нагрузку на autovacuum без изменения архитектуры.➡️ SQL Ready | #совет
