Sql-Server-2012
分區可以幫助加快對非常大的表的插入嗎?
一些背景:
- 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
(管他呢)。那麼你的元數據操作就是視圖的更新,而不是分區表的切換。