SQL Server 2016 啓用數據庫TDE 壓縮性能提升

《SQL Server 透明數據加密(TDE)的影響》一文中,我們給出啓用數據庫TDE的備份時,不啓用壓縮(COMPRESSION )選項建議(有些片面,現在看來需要加上一些限定條件)。因爲在SQL Server 2016版本以前,對TDE數據庫備份時使用COMPRESSION,不但不能減少數據庫備份文件佔用空間,而且備份的時間、CPU都會顯著升高。

從 SQL Server 2016開始,啓用TDE 的數據庫,使用COMPRESSION選項進行備份,其壓縮效果和未啓用TDE之前類似的效果。但是有個前提是,要在BACKUP命令中設置參數MAXTRANSFERSIZE值大於65536(默認值,64KB)的整數倍,在維護計劃→維護計劃嚮導→備份數據庫→選項,可以設置“最大傳輸大小”,如下圖:

值得注意的是,如果您並沒有使用維護計劃進行備份時,您可能還沒有發現這個新的變化。在SQL Server 2016,直至SQL Server 2019版本,我們在SSMS資源管理器中,右擊數據庫→任務→備份數據庫,在備份選項中均沒有“最大傳輸大小”可選。

 

那麼這個參數在備份中如何使用呢?使用這個參數會對備份過程有哪些影響呢?本文將使用試驗的方式給出這些問題的答案。

試驗結果

  • 未啓用TDE,備份時【未】使用ENCRYPTION加密,壓縮,無論是否使用MAXTRANSFERSIZE選項,壓縮效果基本相同;但無論是總耗時還是CPU時間上來看不加MAXTRANSFERSIZE都要遠優於增加此選項

  • 啓用TDE時,是否使用MAXTRANSFERSIZE,對CPU和備份文件大小有顯著影響。如果備份策略安排在低谷期(應用對CPU需求較低),可以考慮將MAXTRANSFERSIZE設置爲默認值的2倍(維護計劃中MAXTRANSFERSIZE 只能設置爲65536的非0正整數倍,腳本中雖然可以將其值設置爲65536加任意整數,如65537,實質上系統的傳輸還是會按照向上取一個EXTENT,即64KB的整數倍的數值),從這個試驗中可以看到,直接設置65536的整數倍在耗時上優於增加任意整數65537約18%,CPU消耗僅僅增加2%

  • 啓用TDE時,不同系統設置MAXTRANSFERSIZE 對性能的影響不同,需要測試去確定設置多大是最優的。

  • 日誌的大小對全備的大小影響較小(無壓縮備份的文件大小僅僅比mdf文件大181KB,而log文件有4GB多)

 

 

 

試驗準備

 

在這裏我們仍然使用《SQL Server 透明數據加密(TDE)的影響》一文中的test庫作爲測試數據庫,SQL Server 版本爲SQL Server 2016企業版。

 

關閉實例中備份壓縮選項

 

關閉實例中備份壓縮選項,這將允許BACKUP命令顯式地指定是否應該使用備份壓縮。

SSMS資源管理器中,右擊實例名→屬性→數據庫設置→壓縮備份左側的多選框未勾選,如下圖:

我們也可以使用如下T-SQL語句查看實例備份壓縮選項的狀態:

SELECT * FROM sys.sysconfigures
WHERE comment LIKE '%Enable compression of backups by default%'
EXEC sp_configure 'backup compression default'

當然,也可以使用下面的命令禁用SQL服務器實例上的備份壓縮設置。

EXEC sys.sp_configure N'backup compression default', N'0'
GO
RECONFIGURE WITH OVERRIDE
GO

dbcc showfilestats :可查看數據庫中數據文件的整體使用情況(按區統計)

DBCC SHOWFILESTATS WITH TABLERESULTS

數據庫使用的Extent和總的分配的Extent還是比較接近的。

可以使用sp_helpdb查看數據庫及數據庫文件、日誌文件的大小,可以用於備份後文件大小的比較。

EXEC sp_helpdb test

試驗樣例

服務器性能的不同,SQL  Server 版本不同等,都可能影響測試的結果,最終性能的影響,取決於您的環境。

--測試1:未啓用TDE,不壓縮,不使用備份加密選項
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithOutCom.bak'
WITH STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 126.102 秒(20.357 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 92 毫秒,佔用時間 = 126409 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試2:未啓用TDE,使用COMPRESSION選項,使用默認最大傳輸大小
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithCom65536.bak'
WITH COMPRESSION
       ,STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 60.227 秒(42.624 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 173 毫秒,佔用時間 = 60551 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試2-1:未啓用TDE,使用COMPRESSION選項,使用默認最大傳輸大小
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithCom65536.bak'
WITH COMPRESSION
       ,MAXTRANSFERSIZE=65536
       ,STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

 

SQL Server 分析和編譯時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 207.799 秒(12.353 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 719 毫秒,佔用時間 = 208160 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試3:未啓用TDE,使用COMPRESSION選項,最大傳輸大小設置爲65537
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithCom65537.bak'
WITH COMPRESSION
       ,MAXTRANSFERSIZE=65537
       , STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 206.892 秒(12.408 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 688 毫秒,佔用時間 = 207270 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試4:未啓用TDE,使用COMPRESSION選項,最大傳輸大小設置爲131072
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithCom131072.bak'
WITH COMPRESSION
       ,MAXTRANSFERSIZE=131072
       , STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 119.628 秒(21.459 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 468 毫秒,佔用時間 = 119980 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試5:未啓用TDE,使用ENCRYPTION選項
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithEncrypt.bak'
WITH ENCRYPTION 
   (
   ALGORITHM = AES_256,
   SERVER CERTIFICATE = TestBackOption
   )
       , STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 123.385 秒(20.805 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 235 毫秒,佔用時間 = 123709 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試6:未啓用TDE,使用ENCRYPTION選項
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithEncryptWithComDefault.bak'
WITH ENCRYPTION 
   (
   ALGORITHM = AES_256,
   SERVER CERTIFICATE = TestBackOption
   )
   ,COMPRESSION
       , STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 61.778 秒(41.554 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 157 毫秒,佔用時間 = 62138 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試7:未啓用TDE,使用ENCRYPTION選項,最大傳輸大小值爲65537
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithEncryptWithCom65537.bak'
WITH ENCRYPTION 
   (
   ALGORITHM = AES_256,
   SERVER CERTIFICATE = TestBackOption
   )
       ,COMPRESSION
       ,MAXTRANSFERSIZE=65537
       , STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 204.448 秒(12.556 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 843 毫秒,佔用時間 = 204873 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試8:未啓用TDE,使用ENCRYPTION選項,最大傳輸大小值爲131072
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_DisableTDEWithEncryptWithCom131072.bak'
WITH ENCRYPTION 
   (
   ALGORITHM = AES_256,
   SERVER CERTIFICATE = TestBackOption
   )
       ,COMPRESSION
       ,MAXTRANSFERSIZE=131072
       , STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 122.020 秒(21.038 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 438 毫秒,佔用時間 = 122384 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試9:啓用TDE
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_EnableTDEWithoutCom.bak'
WITH  STATS = 10
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 122.271 秒(20.995 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 142 毫秒,佔用時間 = 122549 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試10:啓用TDE,壓縮備份,最大傳輸大小爲默認值
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_EnableTDEWithCom.bak'
WITH  STATS = 10
       ,COMPRESSION
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 125.862 秒(20.396 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 219 毫秒,佔用時間 = 126112 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試11:啓用TDE,壓縮備份,最大傳輸大小爲65537
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_EnableTDEWithCom65537.bak'
WITH  STATS = 10
       ,COMPRESSION
       ,MAXTRANSFERSIZE=65537
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

SQL Server 分析和編譯時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 128.927 秒(19.911 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 33766 毫秒,佔用時間 = 129279 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

--測試12:啓用TDE,壓縮備份,最大傳輸大小爲131072
DECLARE @bdatetime AS DATETIME= GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE test
TO DISK='D:\Test_EnableTDEWithCom131072.bak'
WITH  STATS = 10
       ,COMPRESSION
       ,MAXTRANSFERSIZE=131072
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT  @bdatetime, GETDATE(), DATEDIFF(millisecond, @bdatetime, GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 2 頁。

BACKUP DATABASE 成功處理了 328594 頁,花費 105.379 秒(24.360 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 34499 毫秒,佔用時間 = 105796 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章