Nedeniyle MVCC modelinin Postgres arasında ve SQL kurallarına göre, bir UPDATEyeni satır sürümünü yazıyor her için de geçerli satırda WHEREmaddesi.
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 VACUUMsonra 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_nameNULL 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 NULLgü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: