2017年計(jì)算機(jī)等考三級(jí)數(shù)據(jù)庫(kù)輔導(dǎo):SQLServer2008行數(shù)據(jù)和頁(yè)數(shù)據(jù)壓縮解密

字號(hào):

  SQL Server的性能主要取決于磁盤I/O效率,提高I/O效率某種程序上就意味著提高性能。SQL Server 2008提供了數(shù)據(jù)壓縮功能來(lái)提高磁盤I/O。
    數(shù)據(jù)壓縮意味著減小數(shù)據(jù)的有磁盤占用量,所以數(shù)據(jù)壓縮可以用在表,聚集索引,非聚集索引,視圖索引或是分區(qū)表,分區(qū)索引上。
    數(shù)據(jù)壓縮可以在兩個(gè)級(jí)別上實(shí)現(xiàn):行級(jí)別和頁(yè)級(jí)別。頁(yè)級(jí)別壓縮包括行級(jí)別壓縮。表和索引在創(chuàng)建的同時(shí)就可以壓縮,也可以使用Alter Table Rebuild With 或是 Alter Index Rebuild With語(yǔ)法壓縮已存在表或是索引。當(dāng)堆(Heap)上的壓縮狀態(tài)改變時(shí),所有的非聚集索引也會(huì)重建。
    下面讓我們看看壓縮過程到底都做了些什么。
    行壓縮:
    1.減少元數(shù)據(jù)頭記錄數(shù)據(jù)。
    2.所有的數(shù)值類型(integer,decimal,float)或基于數(shù)值類型的類型都會(huì)被壓縮(datetime,money)。比如,100被存在一個(gè)int型字段中,占4位,但是從0~255只需要1位,壓縮后,就節(jié)省了3byte空間。
    3.Char和NChar都被存放于可變長(zhǎng)度的類型中。原因同上。比如,CSDN被存在Char(10)中,但是它只需要Char(4)空間,所以壓縮后就釋放了Char(6)個(gè)空間。
    4.所有類型的NULL和0都不占字節(jié)了。
    頁(yè)壓縮:
    1.進(jìn)行行壓縮。
    2.前標(biāo)壓縮:每一頁(yè)中的所有列,在行標(biāo)頭下面,每行都存儲(chǔ)著一個(gè)行定義值,壓縮后,所有行的定義值都被替換成行頭值的引用。
    3.字典壓縮:字典壓縮和前標(biāo)壓縮類似。前標(biāo)壓縮中,一個(gè)與其他普通值不同的值被定義到每一列上。但是字典壓縮中,每一頁(yè)中所有列的普通值被存在下一行的行頭前面。然后,這些值被替換成新行的引用值。
    下面我們來(lái)看一個(gè)例子:
     USE tempdb GO CREATE TABLE TestCompression (col1 INT, col2 CHAR(50)) GO INSERT INTO TestCompression VALUES (10, ‘compression testing’) GO 5000 – Original EXEC sp_spaceused TestCompression GO – DATA_COMPRESSION = ROW ALTER TABLE TestCompression REBUILD WITH (DATA_COMPRESSION = ROW); GO EXEC sp_spaceused TestCompression GO – DATA_COMPRESSION = PAGE ALTER TABLE TestCompression REBUILD WITH (DATA_COMPRESSION = PAGE); GO EXEC sp_spaceused TestCompression GO – DATA_COMPRESSION = NONE ALTER TABLE TestCompression REBUILD WITH (DATA_COMPRESSION = NONE); GO EXEC sp_spaceused TestCompression GO