Sayfa Sıkıştırma kullanılırken satır ek yükü nedir?


10

650 Sayısal (19,4) sütunlu bir tablo oluşturdum. Sayfa Sıkıştırmasını açtığımda,

ALTER TABLE fct.MyTable REBUILD  WITH (DATA_COMPRESSION = PAGE);

alırım

Msg 1975, Seviye 16, Durum 1
Dizini 'PK_Mytable' satır uzunluğu, izin verilen maksimum '8060' bayt uzunluğunu aşıyor.

ancak 650 kez 9 bayt yalnızca 5850 bayttır, bu da belirtilen 8060 bayt sınırından oldukça uzaktır.

Sunucu SQL Server 2016 SP1 CU2 ile Windows 2012 r2 çalıştırıyor

Sayfa Sıkıştırma kullanılırken satır ek yükü nedir?

İşte ne demek istediğimi göstermek için bazı kod:

/* test script to demo MSG 1975 */
DECLARE @sql NVARCHAR(max)='', @i INT =0
drop table if exists dbo.mytable;

SET @sql = 'Create table dbo.Mytable (MyTableID bigint not null 
  identity(1,1) primary key clustered, '

WHILE @i < 593 BEGIN
    SET @sql += ' Column' + LTRIM(@i) + ' numeric(19,4) null, '
    SET @i +=1
END

SET @sql += ' LastColumn int) '
--SET @sql += ' with (DATA_COMPRESSION = ROW) '
SET @sql += ' with (DATA_COMPRESSION = PAGE) '

SELECT @sql
EXEC sys.sp_executesql @sql

SELECT top 10000 * FROM dbo.MyTable MT

Satır sıkıştırma da başarısız olur, ancak farklı bir satır sayımında.


Birincil anahtarınız ne kadar büyük? Bu bir olgu tablosu ise ve performansı sıkıştırmak ve artırmak istiyorsanız, sütun mağaza dizinlerini okumanızı öneririm, bunlar oldukça etkili olabilir. Sayfa sıkıştırma yükü, sıkıştırmayı açmak için daha fazla işlemci kullanımıdır.
Stijn Wynants

@StijnWynants; BigInts için 8 bayt kullanılır. Bu gerçekten bir gerçektir, ancak bir sütun deposu indeksi garanti etmek için yeterli satır yoktur.
Henrik Staun Poulsen

Yanıtlar:


13

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


1
Sonucunu beğeniyorum: "Çoğu durumda, satır sıkıştırmanın biraz alan kazandırabildiğini göreceksin - her zaman değil." 2718 bayt yükü beklediğimden çok daha fazla. Böyle ayrıntılı bir cevap yazmak için zaman ayırdığınız için çok teşekkür ederim.
Henrik Staun Poulsen

1
@HenrikStaunPoulsen Hatırlanması gereken ek bir önemli nokta, SQL Server'ın verilerinizin sıkıştırılamayabileceğini varsayması gerektiğidir. Bu nedenle , verileriniz 8060 bayttan daha azına sıkıştırılsa bile , SQL Server, sıkıştırılamayan veriler için teorik maksimum satır boyutuna göre satır boyutu hesaplamaları yapmalıdır.
AMtwo

3 gün sonra, Satır sıkıştırması için gerekli bayt sayısına hayran kaldım; Sütun başına 2 bayt. Sayfa Sıkıştırma bunun üzerine yaklaşık 3 bayt ekler. Fakat; yardımın için teşekkürler. En faydalısıydı.
Henrik Staun Poulsen
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.