TinyInt SQL SERVER Depolaması


12

SQL Server'da, neden bir tinyint satır 9B ile saklanır. Nedense NULL bitmap maskesinin sonunda ek bir bayt var gibi görünüyor.

    KULLANIM tempdb;
    GİT

    CREATE TABLE Instagram Hesabındaki Resim ve Videoları tbl
    (
        ben TINYINT NULL DEĞİL
    );
    GİT

    Tbl (i) içine yerleştirin
        DEĞERLER (1);
    GİT

    DBCC IND ('tempdb', 'tbl', -1);
    GİT

    DBCC TRACEON (3604); - Sayfa dökümü konsola gidecek
    GİT

    DBCC PAGE ('tempdb', 1,168,3);
    GİT

Sonuçlar (DBCC PAGE değerleri önce en az önemli baytı gösteren baytları tersine çevirdim):

Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count = 0x0001 = 2B
NULL Bitmap = 0x0000 = 2B (what!?)

1
Bu sadece eğitim mi? Ben gerekli yer düzeltmek için hepim, ama bu muhtemelen endişeleneceğim 1 bayt değil ...
Aaron Bertrand

Bu eğitici. Bir sonraki SQLSaturday konuşmam sıkıştırma üzerinde; bu nedenle, insanların veri türü seçimlerinin sonuçlarını anlamalarına ve sıkıştırmanın tüm veri türleri üzerindeki etkisini göstermelerine yardımcı olmak için her veri türü için örnekler oluşturdum.
ooutwire

Tinyint'in 7B yük ile 1B olarak saklanacağını varsaydım. Kaydın sonunda ekstra baytın ne olduğunu merak ediyorum ???
Ooutwire

TINYINT sütunu tablodaki tek sütun olmadığında farklı sonuçlar görüyorum (ancak beklediğinizle daha uyumlu olup olmadıklarından emin değilim). Oldukça nadir bir kullanım durumu gibi görünüyor.
Aaron Bertrand

Kesinlikle ortak bir endişe kullanım durumu. Sadece depolamada yer alan genel gider maliyetlerini eve götürmek ve yeni başlayanların sütunun sayfada neye benzediğini görmelerini sağlamak için her veri türünü tek başına göstermeye çalışıyordum. Ben ekstra bayt var ... garip buluyorum ... orada ve neden olmadan görmek için beni deli ediyor.
Ooutwire 11:12

Yanıtlar:


12

Basit boyut eklentisini kullanarak kaydı hesaplarsanız gerçekten 8: 4 + 1 + 2 + 1 (başlık + sabit boyut + boş bitmap sayısı + boş bitmap'in kendisi) elde edersiniz. Ancak bir yığın kaydı , 9 bayt olan yönlendirme saplama boyutundan daha küçük olamaz , çünkü kayıt bir yönlendirme saplamasıyla değiştirilebileceğini garanti etmelidir . Bu nedenle, kayıt aslında 9 bayt olacaktır. A smallint, hem hesaplama hem de minimum boyut aracılığıyla 9 bayt olacaktır. Daha büyük olan herhangi bir şey yönlendirme saplamasından daha büyük olduğundan hesaplama boyutunuz kayıt boyutuyla eşleşir.


9 bayt da bu tanım için geçerlidir, CREATE TABLE tbl (i TINYINT NOT NULL PRIMARY KEY)öyleyse bir yığının parçası olsun ya da olmasın tüm satırlar için genel bir kural mıdır?
Martin Smith

1
B- ağaç yığınına (dönüştürülebilir alter table ... drop constraint) ve operasyon değil, tam (üst sayfalar atılır olsun b- ağaç, yaprak sayfaları bağlantısız olsun sol ve sonuç yeniden olan yığın) rezervasyon mantığı hala geçerlidir bu yüzden .
Remus Rusanu

Sanırım bu Remus'un söylediklerini kanıtlıyor ... improve.dk/archive/2011/06/07/…
ooutwire

6

Yazarın kulağına sahip olmak güzel. :-) Kalen, bunun 9'dan küçük herhangi bir şeyin 9'a doldurulduğu minimum satır uzunluğunun bir tür uygulandığından şüpheleniyor. Elbette bunun mümkün olduğu birkaç durum var. Bu hayalet bayt'ı TINYINT ve BIT ve VARCHAR (1) / CHAR (1) için bulacaksınız. SMALLINT veya CHAR (2) 'ye geçerseniz 9'un üzerine çıkmaz, örneğin CHAR (3)' e geçerseniz artacaktır.

Bu nedenle, temel olarak veri türlerini akıllıca seçerek elde edebileceğiniz verimlilikleri belirtebilirsiniz, ancak depolama katmanındaki diğer faktörler nedeniyle kuralların sahip olmadığı bazı uç durumlar olduğunu belirtebilirsiniz.

EDIT Sizin için daha somut bilgilere sahip olmayı umuyorum. İçsel kitabın yazarının şu anda düşündüğü şey olduğunu size bildirmek istedim. % 100 emin değil.


Aaron'a Kalen'e ulaştığın için teşekkür ederim. Dün gece o kitapta kazıyordum ve saçlarımı çıkarıyordum. Bu tür sql_variant için ekstra meta veri bayt gibi burada el sallayarak ve bağırmak için hayalet bayt kurtarmak açıklamak için hiçbir yolu var "Bu dostum budur!"
Şubat

1
Bu yorumu "bu aşırı uç bir durumdur, çünkü her seferinde tek bir tinyint veya char (1) depolamaya çalışmak için pek çok tablo tasarlanmadığından" birleştirebilirsiniz.
Aaron Bertrand
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.