2010-03-02 63 views
8

我正在使用SQL Server 2005.存在包含超過1,000,000,000行的審計跟蹤表。我打算將這張表格歸檔。當我用nolock做一個簡單的選擇時,我仍然可以發現阻塞(可能是IO阻塞與其他進程?)。那麼對於這種情況有沒有最佳做法?存檔超過1,000,000,000行的巨大表格的最佳做法

+0

快照存儲層並將快照中的數據庫作爲獨立實例安裝? – 2010-03-02 04:04:20

回答

4

對於一個表大,你會想找到一些有效的分片/分區策略。在這種意義上歸檔往往是一種分區形式,但不是一種好的分區形式,因爲無論如何您通常都要查詢當前和歸檔。在最糟糕的情況下,您最終會在歸檔和當前表的UNION上產生SELECT,這比根本沒有分割它們更糟糕。

通過尋找其他方式來分割數據,比如記錄類型或其他東西,你通常會做得更好。但是,如果您打算按日期進行分割,請確保您不會查詢歸檔+當前數據集。

此外,SQL Server 2005+不默認啓用MVCC。但是,如果啓用MS稱爲快照隔離的功能,則可以執行此操作。見Serializable vs. Snapshot Isolation Level

而不是啓用此功能的原因是未提交的INSERT或UPDATE將在另一個事務中阻塞SELECT,直到第一個事務提交或回滾爲止。這可能會導致不必要的鎖定並限制您的可伸縮性。

3

創建數據庫的備份並將其恢復到存檔位置。

+0

這是迄今爲止最簡單+最安全的解決方案,尤其是如果您不經常這樣做......或者實際上,尤其是如果您經常這樣做的話。除非你需要像分區那樣更流暢的東西(這需要一點點教育才能正確執行),這是一個很好的選擇。 – 2010-03-02 04:08:21

2

不管你怎麼做,一次選擇10億行都會給服務器帶來壓力。

而不是一次批1000行。 bcp工具自動執行此操作。或者使用SSIS將數據複製到另一個數據庫 - 它幾乎完成了同樣的事情。