Sql-Server-2008

表分區和壓縮會幫助大量使用的 OLTP 數據庫嗎?

  • July 31, 2015

我們有一個非常大的表,超過 300gb,其中有超過 50 億行。此表用於所有關鍵應用程序的審計目的。每秒發生很多插入。由於嚴重阻塞,我們無法在數據庫線上時清除數據。我的老闆是說通過分區和表壓縮將有助於磁碟空間和整體性能。他來自OLAP DW領域。但我非常懷疑這是否適用於 OLTP。我如何說服他這行不通?有文章嗎?

很抱歉讓你失望了,但你的老闆是正確的。我們中的一些 BI 人員至少對 DB 優化有所了解。=) 與任何重大的架構更改一樣,您需要測試並適當地適應您獨特的環境、工作負載、伺服器等。

由於嚴重阻塞,我們無法在數據庫線上時清除數據。

表分區在許多環境中都非常有用,尤其是在具有大型數據集的環境中。您不僅可以避免鎖定問題並提高查詢性能,還可以Truncate在清除舊記錄時使用 after swap out your partitions 來減少日誌影響。

有關SQL Server 中表分區的詳細指南,請參閱Kendra Little 和 Brent Ozar Unlimited的免費培訓,順便說一下,該指南側重於 OLTP 環境。

至於數據壓縮,請參閱此 SQL Server 客戶諮詢團隊白皮書,了解數據壓縮實施。您節省磁碟空間,並以 CPU 使用為代價減少 I/O……這種權衡是您在盲目實施之前需要計劃和測試的東西。

對於詢問壓縮的問題部分,戴夫在權衡方面是正確的。在您走上壓縮之路之前,我會研究為您的系統增加更多容量。

對於分區部分,答案將取決於它。分區需要對目前查詢進行大量規劃和分析,然後才能衡量可能帶來的好處。

Dave 參考了 Kendra 關於分區的影片,但我會推薦她更詳盡的文章,其中包含更多討論和資源來幫助做出決定。還有另一篇關於MSSQL 技巧的文章,其中介紹了一些很好的細節。

根據我在刪除分區之前管理 OLTP 數據庫的經驗,這裡有一些項目是使水平分區有效所必需的:

  1. 一個明確定義的分區範圍,因為每個函式只能有 1000 個分區。
  2. 適合進行分區的列,可以是表的外鍵或日期$$ time $$柱子。日期需要注意的一件事是,您必須向表中添加一個持久計算列,以便您可以定義要分區的日期部分而不是日期列本身,因為分區函式需要確定性值。
  3. 數據分區所在的列必須在 where 子句中才能使用分區,否則將掃描所有分區以滿足查詢。
  4. 每個分區應位於其自己的文件組中,文件組中的文件位於不同的陣列上,以最大化可能的 I/O。

引用自:https://dba.stackexchange.com/questions/108607