Null veya varsayılan olarak null değil mi?


41

MySQL'de, bir alanın gerekli olduğunu bilmediğiniz sürece null değerlerine izin vermek veya Not Nullbir alanın null içerdiğini bilmediğiniz sürece her zaman kullanmak daha mı iyidir ? Yoksa farketmez mi?

Bazı DBMS'lerde Not Nullolabildiğince fazla kullanacaklarını biliyorum çünkü boş değerlere izin vermek, Boş değer durumunu depolamak için kayıt başına ekstra bir bit (veya bayt?) Gerektiriyor.


1
Modellemekte olduğunuz şey için değerin bir yorumu NULLvarsa, ve yalnızca izin vermelisiniz NULL.
jameshfisher

Yanıtlar:


25

Çoğu DB'de, bir NOT NULLsütun belirttiğiniz nedenden dolayı depolanan veriler açısından daha verimli olur ve ayrıca sorgulamak ve dizin oluşturmak için daha verimli olur; bu nedenle, bir sütunda NULL'lara izin vermek istemediğiniz sürece, bunlara açıkça izin vermemeniz gerekir.

Ekstra NOT NULLkısıtlamaların herhangi bir INSERT veya UPDATE ile etkilediğiniz her satır için potansiyel olarak kontrol edilmesi gerekebileceğinden, ancak çoğu veritabanının göreceli yazma ve okuma ağırlığından dolayı bu bir endişe kaynağı değildir. Ekleme / güncelleme işleminin geri kalanının IO'ya bağlı olacağı ve bu nedenle çok daha önemli bir şişe boynu olduğu CPU'ya bağlı bir işlem olduğu için, fazladan zaman harcanması hiç de muhtemel değildir. msgstr "" "kodunuzu (veya diğer kişilerin kodunu) kontrol eden veri yanlışlıkla NULL'ları diğer kodun beklemeyeceği yere koyamaz ve bu yüzden onların varlığında yanlış sonuçlar verebilir.

Düzenleme: Peter yorumunda işaret ettiği gibi, yukarıdaki bir generalizmdir ve tüm DMBS'ler için geçerli olmayabilir, ancak mysql ve mssql için de oldukça eminim. Alandaki diğer komplikasyonlar, null edilebilir sütunların performans dinamiklerini değiştirecek olan seyrek tablolar (örneğin, MSSQL 2008'in uygulandığı gibi) gibi özellikleri içerebilir.


8
Bu PostgreSQL'de mutlaka doğru değildir. Boş sütunlar yerden tasarruf sağlar, bu da hızı artırabilir ve işlem süresi yaklaşık aynı olmalıdır.
Peter Eisentraut

4
Bu aynı zamanda Oracle için de geçerli değil. Ek olarak, MySql'den farklı olarak, Oracle null'ları endekslemez, böylece onları kullanarak indekslerinizin boyutunu küçültebilirsiniz. Bkz stackoverflow.com/questions/289001/does-mysql-index-null-values
Leigh Riffel

8

Şema tasarımınızın ve uygulama gereksinimlerinizin bu kararı yönlendirmesine izin vermelisiniz. Performans farkları çoğu durumda muhtemelen fark edilmez.


3
Bir kez daha, kesin olarak bilmenin en iyi yolu profil oluşturma ve test etmedir.
jcolebrand

Bu kadar geniş ifadelere dikkat ederdim - eğer bir ETL işlemi ile masaya bir gecede 10 milyon satır yazıyorsanız ve bu tablonun bir sürü Not Null kısıtlı alanı varsa, performans etkilerini göreceksiniz.
ScottCher

1
+1: Belki de tüm uygulamalar için doğru değildir, ancak yaptığım şey için tutarlı / doğru veri almak, biraz yer kazanmaktan veya biraz hız kaybetmekten daha önemlidir.
jp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.