SQL Server'da ne kadar "Boş" değer alır


118

10 sütunlu büyük bir masam var. 4 tanesi çoğu zaman boş kalır. Null değeri bayt olarak herhangi bir boyut alan veya hiç boyut almayan bir sorgum var. Bazılarının söylediği birkaç makale okudum:

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

Bir tabloda NULL değerlere sahipsek, bunun depolama alanını kaplamadığına dair bir yanlış anlama var. Gerçek şu ki, bir NULL değer yer kaplar - 2 bayt

SQL: NULL değerleri ve varsayılan değerleri kullanma

Bir NULLveri tabanı değer depolama bir bayt alır ve bir boşluk ya da sıfır ya da başka bir varsayılan değerine karşıt olarak bir değer mevcut değildir gösteren bir sistem bir değerdir.

Boş değer tarafından alınan boyut konusunda bana rehberlik edebilir misiniz?

Yanıtlar:


146

Alan sabit genişlikte ise, NULL depolaması diğer herhangi bir değerle aynı alanı alır - alanın genişliği.

Alan değişken genişlikli ise, NULL değeri yer kaplamaz.

Boş bir değeri depolamak için gereken alana ek olarak, null yapılabilir bir sütuna sahip olmak için ek yük de vardır. Her satır için, o sütunun değerinin null olup olmadığını işaretlemek için null yapılabilir sütun başına bir bit kullanılır. Bu, sütunun sabit veya değişken uzunlukta olmasına bakılmaksızın geçerlidir.


Diğer kaynaklardan alınan bilgilerde gözlemlediğiniz tutarsızlıkların nedeni:

  • İlk makalenin başlangıcı biraz yanıltıcıdır. Makale, bir NULL değeri depolamanın maliyetinden değil, bir NULL saklama yeteneğine sahip olmanın maliyetinden (yani bir sütunu null yapılabilir hale getirmenin maliyetinden) bahsediyor . Bir sütunu null yapılabilir yapmak için depolama alanında bir şeye mal olduğu doğrudur, ancak bunu yaptıktan sonra bir NULL depolamak, bir değeri depolamak için gerekenden daha az yer kaplar (değişken genişlikli sütunlar için).

  • İkinci bağlantı Microsoft Access ile ilgili bir soru gibi görünüyor. Access'in NULL'leri nasıl sakladığının ayrıntılarını bilmiyorum ama SQL Server'dan farklı olursa şaşırmam.


1
@Mark "Bir sütunu null yapılabilir hale getirmenin depolama alanında bir şeye mal olduğu doğrudur, ancak bir kez bir NULL depolamak bir değeri depolamak için gerekenden daha az yer gerektirir (değişken genişlikli sütunlar için)" Bununla şunu kastediyorsunuz değişken veri türleri için bellekte alınan boyut olarak 1 bit aldığını söylemek gerekirse.
Rocky Singh

13
Çoğu bilgisayar sisteminde adreslenebilir en küçük bellek birimi birdir byte(tipik olarak 8 bit). Yani gerçekte, a bitalır a byte. Harika cevap Mark: +1.
JohnB

20
Bununla birlikte, ikinci bir bit ve üçüncü bir bit ve sekizinci bite kadar aynı bayta sığar.
Matti Virkkunen

1
@Mark - Evet bu çok daha net görünüyor. Kaybolan yorum için özür dileriz. Düzeltmek istedim, ancak silme ve gönderme arasında İnternet Bağlantım kesildi! Ayrıca biraz da bağlıdır (Buradaki yorumlar bölümünden) "Yığın ve kümelenmiş dizin kaydı için her zaman bir NULL bit eşlem vardır. Kümelenmemiş dizinler için, dizindeki tüm sütunlar BOŞ DEĞİLSE olmaz."
Martin Smith

2
@Martin Smith: Bunu bilmiyordum. Bu işleri daha karmaşık hale getirir, çünkü eğer doğru anlarsam, bu, bir sütunun null yapılabilir hale getirilmesinin gerekli depolama alanını artırmadığı anlamına gelir (çünkü boş bitmap her zaman mevcuttur) , bu sütun aynı zamanda bir dizinde ve dizindeki diğer sütunlar olmadıkça boş değer atanamaz. Bu durumda, dizin artık boş bir bitmap içermelidir.
Mark Byers

30

Kolon değişken uzunluk ise, örneğin, takip eden bağlantı istemler varcharsonra NULL0 bayt alır (değer olup olmadığını artı 1 bayt bayrak için kullanılan NULLya da değil):

Yukarıdaki bağlantı ve aşağıdaki bağlantı, sabit uzunluktaki sütunlar için, yani char(10)veya intdeğerinin NULLsütunun uzunluğunu kapladığını iddia eder (artı 1 bayt olup olmadığını işaretlemek NULLiçin):

Örnekler:

  1. Eğer bir ayarlarsanız char(10)için NULL, bu kaplar 10 bayt (sıfırlanmasını)
  2. An int4 bayt alır (ayrıca sıfırlanır).
  3. 0 bayt (+ 2 bayt) alan bir varchar(1 million)setNULL

Not: hafif bir teğette, depolama boyutu varchargirilen veri uzunluğu + 2 bayttır.


NULL depolayan bir varchar 0 + 2 + 1 (NULL ek yük) bayt almaz mı?
Akash

NULL işaretlemek için + 1 bit olmalıdır . @Akash: Bitmap değeri zaten NULL olarak işaretlediğinden (bilgi eklenmeyecektir) 2 bayt gerekli olmamalıdır.
Simo Kivistö

5

Bu bağlantıdan :

Her satır, boş değerlere izin veren sütunlar için boş bir bitmap'e sahiptir. Bu sütundaki satır boşsa, bitmap'teki bir bit 1, aksi takdirde 0'dır.

Değişken boyutlu veri türleri için gerçek boyut 0 bayttır.

Sabit boyutlu veri türü için gerçek boyut, varsayılan değere ayarlanmış bayt cinsinden varsayılan veri türü boyutudur (sayılar için 0, karakterler için '').


Nvarchar (max) varchar (max) Null gibi veri türleri için 0 bayt alacağını ve int, chars vb. İçin varsayılan boyutu sahip oldukları varsayılan değerlere alacağını mı söylüyorsunuz?
Rocky Singh

4

NULL değeri saklamak herhangi bir yer kaplamaz.

"Gerçek şu ki, bir NULL değer yer kaplar - 2 bayt."

Bu bir yanlış anlamadır - bu , satır başına 2 bayttır ve boş verilebilir sütun olup olmadığına bakılmaksızın tüm satırların bu 2 baytı kullandığından oldukça eminim.

Veritabanlarındaki bir NULL değeri, bir bayt depolama alan bir sistem değeridir

Bu, genel olarak veritabanlarından bahsediyor, özellikle SQL Server'dan değil. SQL Server, NULL değerleri depolamak için 1 bayt kullanmaz.

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.