Sql-Server

當 ID (INT) 上存在聚集索引時,根據日期對錶(在 MS SQL 中)進行分區是個好主意嗎

  • November 7, 2021

我在 MS SQL Server 中有一張表。

  • 表大小:806 GB
  • 行數:12 億
  • 索引空間:1.2 GB

表用法:來自 Web 服務呼叫的日誌記錄 99.9% 是來自日誌記錄的用法,開發人員很少在 Prod 中查看此表(僅在報告或研究問題時)。

主鍵:基於“INT”數據類型的“ID”。有一個基於該“ID”列的聚集索引。

我對此更改的意圖:想要管理此表(因為它有 10 年的數據)並繼續前進(由於新要求),開發人員/分析師有可能進一步深入研究此表(僅幾個月)而且我不想為相同的目的創建一個新表。

我的問題

  1. *$$ Main question $$*我可以根據“DateCreated”(DATETIME,NOT NULL 列)對該表進行分區,而不會導致問題(邏輯/性能方面)。
  2. *$$ Good to know $$*需要多少時間(我理解這取決於數據庫空間/伺服器記憶體和其他詳細資訊,但大致 # 會很好)對這個巨大的表進行分區(如果可以根據日期進行分區)。問這個問題,因為這是一個生產表,並且經常插入行(現在 ~ 350 條記錄/分鐘)。
  3. $$ Not exactly a question, but asking for recommendation $$有沒有更好的計劃**來管理這張表(不想在生產中保留超過 3 年的數據,計劃在下面提到)?

目前計劃(我是 MS SQL 的新手,所以這是我想出的):

> > * 每個分區保留 3 個月的數據。 > * 系統在每個季度之前自動創建分區。 > * 在活動表中只保留 3 年的分區。 > * 將其他分區移動到 OLD/ARCHIEVE 表(需要創建這個)。真正要清除的舊數據。 > > >

簡短的回答:,你不能這樣做。根據文件

對聚集索引進行分區時,聚集鍵必須包含分區列。

這意味著為了在 上進行分區[DateCreated],您還必須在 上進行集群[DateCreated]


當您考慮一下分區和集群實際上是什麼時,這會更有意義。

只要不衝突,這兩個東西可以一起使用。如果你試圖讓它們發生衝突,你會過得很糟糕。要逐點回答您的項目:

  1. 除非您刪除並重新創建聚集索引以在該列上重建表,否則您[DateCreated] 根本無法分區。這是可能的,但它可能是一個比您提出問題時計劃的更大的項目。
  2. 沒有人可以為你回答這個問題。你需要自己測試一下。幾年前,當我在一個高流量 OLTP 表上刪除並重建一個聚集索引時,GB 使用的數據和索引空間比你描述的要少一個數量級,我花了幾個月的時間來測試哪種方法最安全/最快然後 2 個 DBA 在不停機的情況下完成重建工作大約 10 小時的下班時間。添加分區方案不是該項目的一部分,但我認為它不會簡化事情。
  3. 如果它真的是“一張通常沒人關心的日誌表”,那麼也許你可以做到這一切,而不用擔心保持表線上。幾乎可以肯定,如果不創建至少一個額外的表(可能還有其他幾個對象),您就無法做到這一點。我鼓勵您在數據庫的恢復副本上嘗試多種技術。我懷疑您最終會重命名目前表並重新創建它,以便在使用您選擇的任何方法歸檔數百個舊數據時,可以繼續將日誌寫入一個新的空表(可能使用分區方案)

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