程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2008行數據和頁數據壓縮解密

SQL Server 2008行數據和頁數據壓縮解密

編輯:關於SqlServer

SQL Server的性能主要取決於磁盤I/O效率,提高I/O效率某種程序上就意味著提高性能。SQL Server 2008提供了數據壓縮功能來提高磁盤I/O。

數據壓縮意味著減小數據的有磁盤占用量,所以數據壓縮可以用在表,聚集索引,非聚集索引,視圖索引或是分區表,分區索引上。

數據壓縮可以在兩個級別上實現:行級別和頁級別。頁級別壓縮包括行級別壓縮。表和索引在創建的同時就可以壓縮,也可以使用Alter Table Rebuild With 或是 Alter Index Rebuild With語法壓縮已存在表或是索引。當堆(Heap)上的壓縮狀態改變時,所有的非聚集索引也會重建。

下面讓我們看看壓縮過程到底都做了些什麼。

行壓縮:

  • 1.減少元數據頭記錄數據。
  • 2.所有的數值類型(integer,decimal,float)或基於數值類型的類型都會被壓縮(datetime,money)。比如,100被存在一個int型字段中,占4位,但是從0~255只需要1位,壓縮後,就節省了3byte空間。
  • 3.Char和NChar都被存放於可變長度的類型中。原因同上。比如,CSDN被存在Char(10)中,但是它只需要Char(4)空間,所以壓縮後就釋放了Char(6)個空間。
  • 4.所有類型的NULL和0都不占字節了。

頁壓縮:

  • 1.進行行壓縮。
  • 2.前標壓縮:每一頁中的所有列,在行標頭下面,每行都存儲著一個行定義值,壓縮後,所有行的定義值都被替換成行頭值的引用。
  • 3.字典壓縮:字典壓縮和前標壓縮類似。前標壓縮中,一個與其他普通值不同的值被定義到每一列上。但是字典壓縮中,每一頁中所有列的普通值被存在下一行的行頭前面。然後,這些值被替換成新行的引用值。

下面我們來看一個例子:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved