2012-10-04 47 views
0

我有一些報告,爲我的數據庫中的每個用戶執行一些耗時的數據計算,結果爲每個用戶計算10到20個新記錄。爲了提高報告響應速度,創建了一個夜間作業來運行計算並將結果轉儲到數據庫中的快照表。它只針對活躍用戶運行。SQL Server優化大型更改表

因此,對於50k用戶,其中30k是活動的,作業「更新」300k到大型快照表中的600k記錄。它當前使用的方法是刪除給定用戶的所有以前的記錄,然後插入新的集合。表中沒有PK,只有業務鍵用於分組數據。

所以我的問題是,當每天晚上刪除和添加多達600k條記錄時,是否有技術來優化表來處理這個問題?例如,由於可以根據需要重新創建數據,有沒有辦法在這些更改生效時禁用表的日誌記錄?

UPDATE:

的一個問題是,我不能在批處理做到這一點,因爲腳本的工作方式,它在一次檢查一個用戶,所以它着眼於用戶,刪除先前10-20紀錄,並插入一組新的10-20條記錄。它一遍又一遍地做這個。我擔心事務日誌將耗盡空間或可能發生其他性能問題。我想配置表格,現在擔心數據保存或其他可能會降低速度的項目。我不能刪除索引以及所有這些,因爲人們正在同時訪問該表並更新它。

回答

1

另外值得一提的是,索引可能潛在加快此批量更新,而不是慢下來,因爲UPDATEDELETE報表仍然需要能夠定位在首位受影響的行,如果沒有適當的索引它將訴諸表掃描。

我至少會考慮識別用戶的列上的非聚集索引,並且(假設您使用的是2008)考慮MERGE聲明,這肯定可以避免缺陷目前採用的方法DELETE/INSERT

根據The Data Loading Performance Guide(MSDN),使用跟蹤標誌對MERGE進行插入記錄的最小日誌記錄。

我不會說太多,直到我知道您使用的是哪個版本的SQL Server。

+0

MERGE太棒了。不知道這一點。謝謝。 – CodeGrue

0

這就是所謂的批量插入,你不得不放棄在目標表中的所有指標和大禮包送INSERT命令由;

另一種方式分離(數百insert語句)是使用BULK INSERT語句http://msdn.microsoft.com/en-us/library/ms188365.aspx
但它涉及將數據轉儲到文件。

參見:Bulk Insert Sql Server millions of record

+0

謝謝。我在我的問題中添加了一個更新,以討論爲什麼我不能走這條路。 – CodeGrue

+0

那麼,如果數據庫正在使用,而你正在更新它,我想你只能有一個鏡像數據庫。您可以在該數據庫上執行所有耗時的操作,並將用戶重新路由到該數據庫。反之亦然。 – Anri

0

這真的取決於很多東西,快把你的機器

  • 被處理的記錄
  • 大小
  • 網絡速度

等。

通常,將記錄添加到「堆」或未索引的表中會更快。因此,刪除所有索引並在加載後重新創建它們可能會提高性能。

分區表中可以看到性能優勢,如果你的活躍和不活躍用戶分區(雖然數據集可能是此一點點小)

確保您測試每個TWEAK多久增加或減少你的負荷和工作從那裏。

+0

這與MERGE結合應該是一個很好的解決方案。 – CodeGrue