Sql-Server

對單個文件組進行分區

  • February 25, 2013

我的數據庫中有一些非常大的表,但是這些數據中有很大一部分是“舊的”。

由於我無法控制的情況,我不允許刪除這些“舊”數據。另一個限制是我無法修改數據庫,這意味著向其中添加文件組。現在的情況是,一切都駐留在PRIMARY文件組中。

我正在考慮將這些表劃分為幾個分區,例如“新”、“舊”、“存檔”等。我確實有一個我想用於此目的的“狀態”列。

鑑於所描述的場景和限制,我想知道分區在這裡是否有意義。換句話說,如果我的表以這種方式分區,但所有分區都位於同一個文件組上,那麼 SQL Server 是否足夠聰明,可以在底層文件中找到我的“新”數據所在的特殊區域,而不會觸及有“舊”數據的區域?

換句話說,假設我 80% 的數據是“舊的”。SQL Server 是否有一種機制可以避免訪問 100% 的基礎文件並僅訪問包含“新”數據的 20%(當然,假設我WHERE在查詢的子句中指定了我的分區列)。

我想要回答這個問題,需要了解分區是如何在內部實現的。我很感激任何指示。

在同一個文件組中對錶進行分區有兩個優點:

  1. 允許增量重建大型索引的一部分,從而實現更有效的維護。查看ALTER INDEX [foo] REBUILD PARTITION=n更多詳細資訊。
  2. 利用分區消除和(可能)分區級別鎖定來改進查詢維護。我在我的部落格上討論這個。

如果要進行分區,請記住幾件事。

  • 如果您的表有聚集索引(確實應該),那麼您的分區鍵必須是聚集索引的一部分。
  • 為避免性能問題,您應該對齊分區。這意味著您的所有索引都應該包含您的分區鍵,無論是作為包含還是作為索引本身的一部分。
  • 在目前版本的 SQL Server (2005-2012) 中,分區的索引重建處於離線狀態。如果您的分區太大並且您按分區重建,這可能會導致阻塞問題。

我建議在實施之前對分區進行一些徹底的研究。Kendra Little 有一個很好的資源列表,您可以從中開始。

答案是“是”。它對任何查詢都有一種機制,可以根據用於定義分區的邏輯過濾輸入。

但是,您必須有適當的過濾器,否則將掃描所有分區。這通常涉及使用日期過濾器(在您的情況下)來選擇分區。

強制執行此操作的一種方法是讓視圖僅訪問一個分區,並在視圖中使用正確的邏輯。

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