2011-06-05 126 views
5

對SQL Server 2008 R2使用行級或頁面級壓縮時,SQL Server是否將數據以其壓縮格式或其展開形式存儲到其buffer cache中。壓縮數據如何存儲在緩衝區緩存中,是壓縮的還是未壓縮的?

例如,假設我有一個(網頁級別)壓縮到原來大小的20%的表:

Original size: 100 GB 
Compressed size: 20 GB 

此外,(專用)主機SQL的這個特定實例服務器正在運行具有24 GB的內存。如果查詢執行表掃描,查看所有列(爲了舉例)並且SQL Server將數據緩存爲壓縮數據,那麼理論上它可以將所有數據放在其緩衝區緩存中,並可用於將來的查詢。但是,如果數據緩存未壓縮,則明顯100 GB的數據無法放入24 GB的服務器內存。

那麼,SQL Server如何將壓縮數據存儲在其緩衝區緩存中?

回答

7

壓縮的頁面被壓縮保存在磁盤上,並在讀入內存時保持壓縮狀態。

編號:SQL Server 2008 Data Compression: Strategy, Capacity Planning and Best Practices

數據進行解壓縮(不是整個 頁面,但只有 感興趣的數據值),當它遇到的 下列條件之一:

  • 它作爲查詢響應的一部分被讀取用於過濾,排序,加入。
  • 它由應用程序更新。

沒有內存中,解壓縮的壓縮頁面副本。 解壓數據會消耗CPU。 然而,由於壓縮後的數據使用 較少的數據頁,還節省了:

  • 物理I/O:由於物理I/O是從工作量 角度昂貴,減少物理I/O 常常導致比 節省更多的CPU成本來壓縮 並解壓縮數據。請注意, 物理I/O被保存,因爲從中讀取的數據量較小的數據量爲 ,或者寫入磁盤的數據量爲 ,並且因爲更多的數據可以保留在緩衝池 的內存中。

  • 邏輯I/O(如果數據是在存儲器中):由於邏輯I/O消耗CPU, 減少邏輯I/O可以有時 補償CPU成本 壓縮和解壓縮數據。