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:
bigintMyTableID için 8 bayt
intLastColumn 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 numericdepolama 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 numericsütun artı bigintve intgenel her 1 bayt gerektirir.
Satır sıkıştırılmış depolama gereksinimleri olacaktır:
bigintMyTableID için 8 bayt + 1 bayt ek yükü
intLastColumn 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:
bigintMyTableID için 8 bayt
intLastColumn 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