我有一個表,用的idMap DML:SQL服務器更新索引設計
CREATE TABLE tempdb2.dbo.idmaptemp (
OldId varchar(20),
CV_ModStamp datetimeoffset,
NewId varchar(20),
RestoreComplete bit,
RestoreErrorMessage varchar(1000),
OperationType varchar(20)
)
當它被定義,它已經包含了一組預定義約(100萬)的行。恢復操作完成後,我必須更新表上的NewId,RestoreComplete,RestoreErrorMessage。 的說法是:
update tempdb2.dbo.IdMaptemp set NewId = 'xxx', RestoreComplete = 'false', RestoreErrorMessage = 'error' where OldId = 'ABC';
Java應用程序對內存約一百萬值,並與上述語句更新的值。數據庫設置爲自動關閉,並隨批次(批量大小500)而變化。
我曾嘗試在索引兩個選項與OLDID領域:
聚集索引 - 執行計劃列爲聚集索引更新(100%的成本)。這是因爲葉子是正在更新的行,哪些會觸發索引更新。我在這裏嗎?
非聚集索引 - 執行計劃列出更新(75%)和查找(25%)。
是否有任何其他的速度ups可以實現在數據庫表上的批量更新?該表不能被更新影響,因此無法清除並重新插入該表。每批500行樣本的聚簇索引需要大約7小時更新。
我應該選擇非聚集索引選項嗎?
百分比毫無意義,它們只是表明成本如何分配到計劃中,它們在計劃外沒有任何價值。 –
@Mark Rotteveel任何可以找到執行計劃需要花費時間的信息? – dmachop
如果您正在解決性能問題,也許您可以將更新從Java遷移到SQL腳本中。您是否在此表上運行了100萬個單獨的更新語句?如果是這樣,您可能會發現很大一部分性能問題是由於各個更新語句而不是任何特定的索引。如果您可以重構流程以在數據庫中執行所有這些操作,則會更快。例如,批量將百萬個值加載到另一個表中,然後在一個批處理中執行數據庫更新。 –