啟用DATA_COMPRESSION選項時在資料異動(DELETE、INSERT、UPDATE)的效能較差,在啟用DATA_COMPRESSION=ROW或PAGE後,若要異動資料時可以先把DATA_COMPRESSION設定為NONE在異動資料如此效能會提高。
實作新增資料時DataCompression對Index的影響。
在Day12_淺談Index與DataCompression有提到啟用DataCompression選項會在異動資料(UPDATE、DELETE、INSERT)會降低效能。
本篇主要測試DataCompression在資料異動時對Index的實際影響。
資料異動測試:
資料異動測試一:建立Index時啟用DATA_COMPRESSION=PAGE選項
IF OBJECT_ID('FactInternetSalesCopy') IS NOT NULL
BEGIN
DROP TABLE FactInternetSalesCopy
END
GO
--建立測試的Table
SELECT * INTO FactInternetSalesCopy FROM AdventureWorksDW.dbo.FactInternetSales
WHERE 1=2
GO
--建立叢集索引並啟用DATA_COMPRESSION=PAGE選項
CREATE CLUSTERED INDEX [IX_FactInternetSales] ON [dbo].[FactInternetSalesCopy]
(
[SalesOrderNumber] ASC,
[SalesOrderLineNumber] ASC
)
WITH (DATA_COMPRESSION=PAGE,MAXDOP=2)
GO
--建立測試資料
INSERT INTO FactInternetSalesCopy
SELECT * FROM AdventureWorksDW.dbo.FactInternetSales
執行結果:
邏輯讀取是144092ms,經過時間是3688ms,CPU時間是3828ms
資料異動測試二:建立Index時不啟用DATA_COMPRESSION=PAGE選項
IF OBJECT_ID('FactInternetSalesCopy2') IS NOT NULL
BEGIN
DROP TABLE FactInternetSalesCopy2
END
GO
--建立測試的Table
SELECT * INTO FactInternetSalesCopy2 FROM AdventureWorksDW.dbo.FactInternetSales
WHERE 1=2
GO
--建立叢集索引
CREATE CLUSTERED INDEX [IX_FactInternetSales2] ON [dbo].[FactInternetSalesCopy2]
(
[SalesOrderNumber] ASC,
[SalesOrderLineNumber] ASC
)
WITH (MAXDOP=2)
GO
--建立測試資料
INSERT INTO FactInternetSalesCopy2
SELECT * FROM AdventureWorksDW.dbo.FactInternetSales
執行結果:
邏輯讀取是172041ms,經過時間是1585ms,CPU時間是1875ms
資料異動測試結果:
結論:在不啟用DATA_COMPRESSION選項時在資料異動的效能較好,由圖表顯示差了一倍,在啟用DATA_COMPRESSION=ROW或PAGE後,要異動資料時可以先把DATA_COMPRESSION設定為NONE在如此效能會比較好,此外資料壓縮還可以搭配Partition Table,這部分以後會討論到。