Tablonuzu kümelenmiş PK Kısıtlaması olmadan oluşturmaya çalışırsanız ve biraz farklı bir hata alırsınız:
Msg 1701, Seviye 16, Durum 1, Satır 1 'Mytable' tablosu oluşturma veya değiştirme başarısız oldu çünkü minimum satır boyutu 1530 bayt dahili ek yük de dahil olmak üzere 8067 olacaktı. Bu, izin verilen maksimum tablo satırı boyutunu 8060 bayt aşıyor.
Bu hata iletisinde, sayfa sıkıştırması için 1530 bayt dahili ek yük olduğunu görebilirsiniz.
Şimdi, matematiği yapabilirsiniz:
bigint
MyTableID için 8 bayt
int
LastColumn için 4 bayt
- 593
numeric(19,4)
sütunun her biri için 9 bayt (toplam 5337 bayt)
- 1530 bayt sıkıştırma yükü
Yani, 8 + 4 + (593 * 9) + 1530 = 6879.
Bir saniye ... Bu hala 8060'ın altında. Ne var ne yok ?!
Sayfa Sıkıştırma algoritması aslında birkaç sıkıştırma algoritmasını bir arada toplar. İlk adım ROW sıkıştırmasını uygulamaktır. Satır sıkıştırma ek yükü, bu hata iletisinde listelenen 1530 bayt ek yüküne dahil edilmez.
Burada satır sıkıştırmanın nasıl çalıştığı hakkında daha fazla bilgiyi blogumda ve burada BOL'da bulabilirsiniz . BOL makalesinde numeric
depolama alanını "Bu depolama vardecimal depolama biçimiyle tamamen aynı" olarak tanımladığını, ancak açıklamadığını göreceksiniz vardecimal
. Bu yazıvardecimal
biraz daha kapsar - esasen, gerçek uzunluğu saklamak için sütun başına 2 bayt ek yük ekler (ne yaptığına benzer varchar
).
Sıra sıkıştırma 593 her biri için ek 2 bayt gerektirir numeric
sütun artı bigint
ve int
genel her 1 bayt gerektirir.
Satır sıkıştırılmış depolama gereksinimleri olacaktır:
bigint
MyTableID için 8 bayt + 1 bayt ek yükü
int
LastColumn için 4 bayt + 1 bayt ek yükü
- 593
numeric(19,4)
sütunun her biri için 9 bayt + 2 bayt ek yükü
- 1188 bayt ROW sıkıştırma yükü
8 + 4 + (593 * 9) = 5349 bayt veri
1 + 1 + (593 * 2) = 1188 bayt satır sıkıştırma yükü
Satır sıkıştırılmış şema için toplam 6537 bayt
Artık satır sıkıştırılmış şema için satır boyutuna sahip olduğumuza göre, matematiğimizi tekrar ziyaret edebiliriz. Sayfa sıkıştırılmış satır boyutu, veri boyutu + satır sıkıştırma yükü + sayfa sıkıştırma yükü olacaktır:
bigint
MyTableID için 8 bayt
int
LastColumn için 4 bayt
- 593
numeric(19,4)
sütunun her biri için 9 bayt
- 1188 bayt ROW sıkıştırma yükü
- 1530 bayt PAGE sıkıştırma yükü
5349 bayt veri
+ 1188 bayt satır sıkıştırma yükü
+ 1530 bayt sayfa sıkıştırma yükü
Toplam 8067 bayt