Завдяки моделі MVCC Postgres і відповідно до правил SQL, a UPDATE
пише нову версію рядків для кожного рядка, яка не виключається в WHERE
пункті.
Це робить мають більш-менш істотний вплив на продуктивність, прямо і побічно. "Порожні оновлення" мають таку саму ціну за рядок, як і будь-яке інше оновлення. Вони спрацьовують триггерами (якщо вони є), як і будь-яке інше оновлення, вони мають бути зафіксованими WAL, і вони створюють мертві рядки, що роздувають таблицю і створюють більше роботи для VACUUM
подальшого, як і будь-яке інше оновлення.
Записи індексів та стовпців TOASTed, де жоден із залучених стовпців не змінено, можуть залишатися однаковими, але це справедливо для будь-якого оновленого рядка. Пов'язані:
Майже завжди добре виключати такі порожні оновлення (коли є фактичний шанс, що це може статися). Ви не вказали визначення таблиці у своєму запитанні (що завжди гарна ідея). Ми повинні припустити, що це first_name
може бути NULL (що не буде дивно для "імені"), тому запит повинен використовувати порівняння, безпечне для NULL :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
Якщо first_name IS NULL
перед оновленням, тест з just first_name <> 'Michael'
би оцінив NULL і виключив рядок із оновлення. Хитра помилка. Якщо стовпець визначенийNOT NULL
, використовуйте просту перевірку рівності, оскільки це трохи дешевше.
Пов'язані: