Nedeniyle MVCC modelinin Postgres arasında ve SQL kurallarına göre, bir UPDATE
yeni satır sürümünü yazıyor her için de geçerli satırda WHERE
maddesi.
Bu does doğrudan ve dolaylı olarak, performansı üzerinde az ya da çok önemli bir etkiye sahiptir. "Boş güncellemeler", diğer güncellemelerle aynı satır başına maliyete sahiptir. Diğer güncellemeler gibi (varsa) tetikleyicileri tetiklerler, WAL tarafından kaydedilmeleri gerekir ve masayı şişiren ve daha VACUUM
sonra diğer güncellemeler gibi daha sonra daha fazla çalışmaya neden olan ölü sıralar üretirler .
Endeksler girdileri ve tost sütunları dahil sütunların hiçbiri değiştirilir olabilir aynı kalır, ama bu herhangi bir güncellenen satır için geçerlidir. İlgili:
Neredeyse her zaman bu tür güncellemeleri dışlamak iyi bir fikirdir (gerçek bir ihtimal olduğunda olabilir). Sorunuzda bir tablo tanımı yapmadınız (bu her zaman iyi bir fikirdir). first_name
NULL olabileceğini varsaymalıyız (bu bir "ilk isim" için şaşırtıcı olmaz), bu nedenle sorgunun NULL güvenli karşılaştırma kullanması gerekir :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
Eğer first_name IS NULL
güncellemeden önce, bir test sadece first_name <> 'Michael'
NULL olarak değerlendirirsiniz ve bu güncelleme gelen satır hariç olarak. Sinsi hata. Eğer sütun olduğunu tanımlanmışNOT NULL
bu biraz daha ucuz olduğu için, olsa da, basit eşitliği denetimini kullanın.
İlgili: