[SQL SERVER][Performance]善用資料壓縮#實做

[SQL SERVER][Performance]善用資料壓縮#實做

上篇我有提到資料壓縮技術可大量降低 IO讀取、memory(data buffer)、Storage space和Network傳輸量的大小,

這裡我可能沒有太多時間一一呈現相關測試資料,不過還是可以看到資料壓縮所帶來的效果。

 

建立測試資料表

create table mytbl
(id int identity (1,1),
data varchar(1000))

新增測試資料

declare @i int
set @i = 1
while @i <= 1000000
begin
insert into dbo.mytbl values('ricoisme')
set @i = @i + 1
end
go

 

確認筆數

image_thumb59

總共一百萬筆資料。

 

類型一:使用頁面壓縮

查看現有資料表預估使用空間

dbcc updateusage ('demotest', 'mytbl')
exec sp_spaceused mytbl

image_thumb60

reserved=26000KB。

 

查看預估壓縮所節省空間  

image_thumb61

size_with_requested_compression_setting(KB)=11448。

 

執行delete operation

delete top(1000) from dbo.mytbl where id between 3000 and 13000
go

image_thumb62

刪除1000筆資料。

 

再度查看使用空間

image_thumb64

雖然成功刪除資料後,但空間並未釋放。

 

再度查看預估壓縮所節省空間

image_thumb65

由於空間並未釋放,所以預估壓縮所節省空間數值不變是可以理解的。

 

執行查詢

select * from dbo.mytbl tt where tt.id between 100 and 754872
go 

image_thumb66

邏輯讀取3247表示資料以從記憶體中撈出(data buffer)。 

 

image_thumb67

該查詢執行計畫。

 

現在我們啟用頁面壓縮來看看相關變化

--順便使用parellel縮短壓縮作業時間
ALTER TABLE dbo.mytbl 
REBUILD WITH (DATA_COMPRESSION=PAGE, MAXDOP=2);  

image_thumb68

 

查看預估使用空間

image_thumb69

reserved=10968KB,果然減少很多。

 

查看預估壓縮所節省空間

EXEC sp_estimate_data_compression_savings 'dbo', 'mytbl', NULL, NULL, 'Page' ;

image_thumb70

size_with_requested_compression_setting(KB)=10920,看來頁面壓縮已到極限。

 

執行查詢

先清除Cache

image_thumb71

select * from dbo.mytbl tt where tt.id between 100 and 754872
go

image_thumb72

相同的資料列大小,但啟用壓縮後,邏輯讀取果然大幅度降低。

 

image_thumb73

啟用頁面壓縮技術後,果然也影響了執行計畫的變更(IO和運算子成本)。

 

總表:

image_thumb74

資料壓縮類型=PAGE,壓縮比率≒2.38。

 

類型二:使用資料列壓縮

取消資料壓縮功能

ALTER TABLE dbo.mytbl 
REBUILD WITH (DATA_COMPRESSION=NONE, MAXDOP=2);

image_thumb75

 

新增測試資料

truncate table dbo.mytbl
declare @i int
set @i = 1
while @i <= 1000000
begin
insert into dbo.mytbl values('ricoisme')
set @i = @i + 1
end
go
 

 

查看預估使用空間

dbcc updateusage ('demotest', 'mytbl')
exec sp_spaceused mytbl

 image_thumb77

reserved:26000KB。

 

查看預估壓縮所節省空間

EXEC sp_estimate_data_compression_savings 'dbo', 'mytbl', NULL, NULL, 'ROW' ;
Go 

image_thumb78

size_with_requested_compression_setting(KB)=16568。

 

執行delete operation

delete top(1000) from dbo.mytbl where id between 3000 and 13000
go

 image_thumb79

刪除1000筆資料。

 

再度查看預估使用空間

image_thumb80

雖然成功刪除資料後,但空間並未釋放。

 

再度查看預估壓縮所節省空間

image_thumb81

size_with_requested_compression_setting(KB)數值依然沒有改變。

 

執行查詢

select * from dbo.mytbl tt where tt.id between 100 and 754872
go

image_thumb82

邏輯讀取3247。

 

image_thumb83

該查詢執行計畫。

 

現在我們啟用資料列壓縮來看看相關變化 

--順便使用parellel縮短壓縮作業時間
ALTER TABLE dbo.mytbl 
REBUILD WITH (DATA_COMPRESSION=ROW, MAXDOP=2);

image_thumb84

 

查看預估使用空間

image_thumb85

reserved=15832KB,該數值沒有頁面壓縮來的小,是因為頁面壓縮也包含了資料列壓縮。

 

查看預估壓縮所節省空間

image_thumb86

size_with_requested_compression_setting(KB)=15792。

 

執行查詢

select * from dbo.mytbl tt where tt.id between 100 and 754872
go

image_thumb87

相同資料列,啟用資料列壓縮後,邏輯讀取果然降低,

雖然降低幅度沒有頁面壓縮來的大,但在CPU和整體時間也相對沒有頁面壓縮來的長。

 

image_thumb88

啟用資料列壓縮技術後,果然也影響了IO和運算子成本。

 

總表:

image_thumb89

資料壓縮類型=ROW,壓縮比率≒1.645。

 

結論:

一般來說一句SQL statement的執行計畫,我們比較在意io和運算子成本這兩項數值應該越低越好,

因為減少io讀取也是減少記憶體使用量,

而運算子成本表示查詢最佳化工具執行此作業的查詢成本,

你不希望一句SQL statement的執行計畫太過複雜,

因為查詢引擎會選擇最有效率的作業來執行查詢或執行陳述式,

所以我們要讓盡量降低計算統計值所花費的時間,而在SQL2008使用資料壓縮技術便可以輕鬆達到這需求。

啟用資料壓縮技術後,雖然整體時間拉長一點點(大部分都花費在cpu時間),

但所減少IO讀取、memory(data buffer)、Storage space和Network傳輸量幅度卻是相當大,個人認為這項技術真的很實用。