Karena model MVCC Postgres, dan sesuai dengan aturan SQL, sebuah UPDATE
menulis versi baris baru untuk setiap baris yang tidak dikecualikan dalam WHERE
klausa.
Ini memang memiliki dampak yang lebih atau kurang substansial pada kinerja, secara langsung dan tidak langsung. "Pembaruan kosong" memiliki biaya per baris yang sama dengan pembaruan lainnya. Mereka mengaktifkan pemicu (jika ada) seperti pembaruan lainnya, mereka harus log-WAL dan mereka menghasilkan baris mati membengkak tabel dan menyebabkan lebih banyak pekerjaan untuk VACUUM
nanti seperti pembaruan lainnya.
Entri indeks dan kolom TOASTed di mana tidak ada kolom yang terlibat yang diubah dapat tetap sama, tetapi itu berlaku untuk setiap baris yang diperbarui. Terkait:
Ini hampir selalu merupakan ide yang baik untuk mengecualikan pembaruan kosong tersebut (ketika ada kemungkinan itu terjadi). Anda tidak memberikan definisi tabel dalam pertanyaan Anda (yang selalu merupakan ide bagus). Kita harus menganggap first_name
bisa NULL (yang tidak akan mengejutkan untuk "nama depan"), oleh karena itu kueri harus menggunakan perbandingan NULL-aman :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
Jika first_name IS NULL
sebelum pembaruan, pengujian dengan hanya first_name <> 'Michael'
akan mengevaluasi ke NULL dan dengan demikian mengecualikan baris dari pembaruan. Kesalahan licik. Jika kolom didefinisikanNOT NULL
, gunakan pemeriksaan kesetaraan sederhana, karena itu sedikit lebih murah.
Terkait: