2016-01-08 25 views
0

我有一張超過10億行的表格。我想基本上有這張表的副本,但是我需要通過較小的塊添加記錄並從最新的記錄開始。我希望有最短的時間進行總操作(創建表,插入行,創建索引)。如何優化插入行和創建索引?

源和目標具有3個指標:

1 =羣集(column1的ASC,列2 ASC)

2 =非唯一非聚集(列2 ASC,欄3 ASC)

3 =非唯一非羣集(Column4 ASC,Column5 ASC)

我想插入由Column1 DESC排序的我的列。在90%的情況下,Column1是唯一的,大約9%的情況下少於5個重複。 Column1 + Column2始終是唯一的。如果它可以幫助優化,我可以在其他列上添加排序,但是我必須先通過Column1 DESC開始排序。

所以我想知道最快的過程應該是什麼。請注意,我的插入將以大塊(大概100萬)完成。我目前的計劃是這樣的:

1:不帶指數

2創建表:由大塊,ORDER BY列1 DESC插入數據。每個塊包含在BEGIN-COMMIT/ROLLBACK TRANSACTION塊中。這是在一個定期的SQL作業調用的存儲過程中。

3:在每個X塊之後,收縮數據庫日誌。這是爲了防止磁盤空間被炸燬。

4:創建索引#1

5:創建索引#2

6:創建索引#3

7:收縮日誌

參見:TSql, building indexes before or after data input

+0

十億行??? – i486

+0

作爲SQL Server中重複過程的一部分收縮通常不是一個好主意。如果您正在使用'FULL'恢復模式並在頻繁的時間間隔內(例如,使用按計劃運行的代理程序作業)進行事務日誌備份,則您將防止日誌變得過大*,而不會*縮小。 – alroc

+0

@alroc很高興知道,謝謝。我忘了提及我計劃將插入作爲SQL作業調用的存儲過程來運行。基於這一點以及你所說的話,我不應該在X插入後收縮日誌,我最終應該只做一次。 –

回答

0

一張一頁移動記錄結果變得非常長,有或沒有索引,所以這個選項被拋出。此外,當我們嘗試它時,我們的事務日誌的磁盤空間變得巨大,並使大多數查詢失敗。

我們最終做的是使用建議的SQL批量傳輸工具,新表沒有索引。這花了大約一個小時爲十億+行。然後重新創建索引每個只需要幾分鐘。