SQL Server 2012 – Veri Sıkıştırma Yöntemleri

Bu yazıda SQL Server 2012 ile birlikte desteklenen sıkıştırma metotları incelenecektir.

SQL Server 2012 ile birlikte önceki sürümde de desteklenen RAW ve PAGE seviyesinde veri sıkıştırma yöntemleri, tablo ve indexler için desteklenmektedir. Herhangi bir sıkıştırma metotu kullanılarak I/O duyarlı uygulamaların performansı arttırılırken yer kazancı sağlanabilmektedir. Bu sayede aynı veri daha az sayfada tutulacak ve sorgularda daha az sayfa sorgulanacaktır.

Tüm bu işlemlerin aynı zamanda var olan CPU performansını düşüreceği unutulmamalıdır. Bu sebeple var olan veri tabanı altyapısı için hangi sıkıştırma metotunun kullanılacağı ve hangi tabloların sıkıştırılması gerektiği uygun bir strateji ile belirlenmelidir.

Bu yazıda SQL Server 2012 ile birlikte sunulan iki farklı veri sıkıştırma metotu arasındaki temel farklar incelenecektir.

ROW Sıkıştırma:

Page sıkıştırma yöntemine göre daha az alan kazancı sağlayan ancak bunu daha fazla CPU performansı sunarak gerçekleştirilen bu metot ile Null ya da 0 değerleri sayfa içerisinde tutulmaz. Aynı zamanda belirli veri tipleri için kullanılabilecek en az alanı kullanmaya çalışarak yer kazancı sağlar.

Örneğin AABB isimli bir değerin CHAR(10) veri tipi kolonunda saklandığını düşünelim. Varsayılanda bu değer disk üzerinde 10 Byte yer kaplayacaktır. ROW Sıkıştırma ile kapladığı yer 4 Byte'a düşürülebilir.

http://msdn.microsoft.com/en-us/library/cc280576.aspx linkindeki tabloda farklı veri tiplerinin ROW sıkıştırmadan nasıl etkilendikleri incelenmiştir.

PAGE
Sıkıştırma:

Page sıkıştırma yöntemi kullanıldığında 3 farklı operasyon ile sıkıştırma işlemi gerçekleştirilir:

  • Row Sıkıştırma: Yukarıda bahsedilen sıkıştırma yöntemi uygulanır.
  • Prefix Sıkıştırma: Bu yöntem ile birlikte her bir kolonda tutulan veriler incelenir ve prefix olarak kullanılabilecek değerler belirlenir. Her bir kolon içerisinde prefix olarak kullanılabilecek satırlar Compression Information Structure (CIS) adı verilen sayfada tutulur. Bu sayede kolon içerisinde tekrarlanan tüm veriler için uygun prefix numarası ataması gerçekleştirilir ve verinin tamamı yerine referans edilen bölümleri tutulur.

Yukarıdaki sıkıştırma yöntemini bir örnek ile inceleyelim. Aşağıdaki gibi bir kolon içerisinde tekrarlanan verilerin olduğunu düşünelim.

aaacd

aaa

aaaba

aaaef

aaadc

abcd

aafe

cccab

ccca

ccc

bbca

bbed

Prefix sıkıştırma uygulandıktan sonra tekrarlanan veriler için Prefixler oluşturulur ve bu veriler CIS içerisinde saklanır. Son durumda oluşturulan Prefixler ve satırlar içerisinde verilen referanslar aşağıdaki gibi olacaktır.

aaa(0)

ccc(1)

bb(2)

0cd

0

0ba

0ef

0dc

abcd

aafe

1ab

1a

1

2ca

2ed

Görüldüğü gibi AAA, CCC ve BB tekrarlanan verileri Prefix olarak oluşturulmuş ve 0,1,2 değerleri atanmıştır. Ardından tüm veriler üzerinde yalnızca Prefix referans numarası atanarak tutulan veri boyutunda önemli ölçüde kazanç sağlanmıştır.

  • Dictionary Sıkıştırma: Prefix sıkıştırma sonrasında son olarak Dictionary sıkıştırma yöntemi uygulanır. Bu yöntemde Prefix sıkıştırmadan farklı olarak sayfanın herhangi bir yerindeki tekrarlayan veriler de referanslar ile değiştirilir. Tekrarlanan verinin değerin başında, ortasında ya da sonunda olması fark etmeyecektir.

Yukarıdaki sutun üzerinde uygulandığında aşağıdakine benzer bir sonuç elde edilecektir.

aaa(0)

ccc(1)

bb(2)

cd(4)

 

 

04

0

0ba

0ef

0dc

ab4

aafe

1ab

1a

1

2ca

2ed

Verilerin sonunda tekrarlayan CD değeri, CIS içerisine eklenmiş ve içerideki verilerde referans numarası olarak 4 kullanılmıştır. Böylece ilk veri 04 haline gelmiş, bir önceki sıkıştırma yönteminden daha fazla yer kazancı sağlanmıştır.

Yukarıdaki bahsedilen sıkıştırma yöntemlerinin uygulanması için aşağıdaki adımlar izlenebilir:

  • Aşağıdaki T-SQL sorgusu ile öncelikle sp_estimate_data_compression_savings prosedürü çalıştırılır ve ROW sıkıştırma kullanıldığında tahmini nesne boyutu döndürülür. Sonrasında belirlenen tablo içerisinde ROW sıkıştırma aktif edilir.

USE AdventureWorks2012;

GO

EXEC sp_estimate_data_compression_savings 'Production', 'TransactionHistory', NULL, NULL, 'ROW' ;

ALTER TABLE Production.TransactionHistory REBUILD PARTITION = ALL

WITH (DATA_COMPRESSION = ROW);

GO

DATA_COMPRESSION bölümünde ROW değeri yerine PAGE kullanılarak da diğer yöntem aktif edilebilmektedir.