Sql-Server-2012

分區可以幫助加快對非常大的表的插入嗎?

  • August 18, 2016

一些背景:

  • SQL 2012 企業版
  • OLTP 表目前有 1B 條記錄
  • 記錄每天增加 5-10M
  • 帶有快閃記憶體的 SAN lun
  • 兩個索引(一個聚集標識 int)

我們注意到隨著時間的推移,INSERT 的速度逐漸放緩,如果保持不變,這最終將成為業務的一個問題。

問題:我們計劃很快過渡到在此表上使用分區,主要用於空間管理,但這裡的主要問題是分區是否有助於提高 INSERT 的性能。(我們已經知道 SELECT 的性能提升,如果可能,請不要評論這方面的事情。)

我已經做了相當多的搜尋論壇等,但沒有找到任何特定於 INSERT 和分區的內容。在我看來,這將有助於隨著時間的推移保持速度是合理的,因為我們將在“插入日期”進行分區,並且 INSERT 將始終被定向到最新的分區,但需要確認。

謝謝大家。

更新:澄清:由於 OLTP 的性質,暫存表(用於切換)不是一個選項,並且需要在插入後立即讀取數據,這兩者都不能延遲等待切換。

簡短的回答:是的,它可以提供幫助,因為它在理論上是瞬時的。您可以將數據插入到與主分區表具有相同定義的暫存表中,然後將其切換到分區表中,這是一種元數據操作(模式鎖)。

長答案:從長遠來看,擁有如此大的表可能會降低性能,除非您遷移到更高版本的 SQL Server,否則統計資訊更新非常難以管理。

如果這是一個重讀表,我會考慮改用視圖分區。每個月(例如)都會有自己的表,對日期列有檢查約束,以幫助查詢優化器知道數據的物理儲存位置,並在其頂部提供一個視圖:

SELECT col1, col2, col3, col4 FROM period201501
UNION ALL
SELECT col1, col2, col3, col4 FROM period201502
...
SELECT col1, col2, col3, col4 FROM period201608

(管他呢)。那麼你的元數據操作就是視圖的更新,而不是分區表的切換。

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