2017-04-27 49 views
0

我有一個表,用的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領域:

  1. 聚集索引 - 執行計劃列爲聚集索引更新(100%的成本)。這是因爲葉子是正在更新的行,哪些會觸發索引更新。我在這裏嗎?

  2. 非聚集索引 - 執行計劃列出更新(75%)和查找(25%)。

是否有任何其他的速度ups可以實現在數據庫表上的批量更新?該表不能被更新影響,因此無法清除並重新插入該表。每批500行樣本的聚簇索引需要大約7小時更新。

我應該選擇非聚集索引選項嗎?

+1

百分比毫無意義,它們只是表明成本如何分配到計劃中,它們在計劃外沒有任何價值。 –

+0

@Mark Rotteveel任何可以找到執行計劃需要花費時間的信息? – dmachop

+0

如果您正在解決性能問題,也許您可​​以將更新從Java遷移到SQL腳本中。您是否在此表上運行了100萬個單獨的更新語句?如果是這樣,您可能會發現很大一部分性能問題是由於各個更新語句而不是任何特定的索引。如果您可以重構流程以在數據庫中執行所有這些操作,則會更快。例如,批量將百萬個值加載到另一個表中,然後在一個批處理中執行數據庫更新。 –

回答

0

更改大表的聚簇索引是一個昂貴的建議。表的聚集索引是爲整個表定義的,而不是針對行的子集。

如果您將oldid作爲聚簇索引而僅想提高批處理性能,請考慮允許db參與批處理過程而不是應用程序/ java層。要求db一次更新數百萬行1行,這是一個昂貴的建議。用批量填充臨時表然後讓SQL一次更新整個批處理可以是提高性能的好方法。

insert #temptable (OldId,NewId) 
... 

Update 
set T1.NewId = T2.NewId 
T1 
from 
T1 join #tempTable T2 
on T1.OldId = T2.OldId 

如果您可以計算新的ID,請考慮另一種批量策略。

update tempdb2.dbo.IdMaptemp top 1000 set NewId = 'xxx', RestoreComplete = 'false', 
    RestoreErrorMessage = 'error' where NewId is null; 

如果你真的想創建NEWID新表的聚集索引 創建新表,只要你喜歡

insert into NewTable() 
select top 10000 * 
from OldTable O 
left join NewTable N 
on O.OldId = N.OldId 
where N.OldId is null 

完成後,刪除舊錶。

注意:您的ID是否需要20個字節?通常,聚簇索引是int - 4個字節或bigint - 8個字節。

如果這是一次性事情,那麼更改大型永久性表上的聚集索引將是值得的。如果oldid將始終處於獲取newid值的過程中,並且這只是您擁有的工作流程,但我不打擾更改持久表的聚簇索引。只需將oldid作爲聚簇索引即可。 NewId聽起來像是代理鍵。

+0

由於這是一個臨時表,所以可以在創建時修改表上的索引。最終,通過加入新的ID,將狀態寫入數據源表。這似乎是在數據庫上更新大量值的永無止境的循環。由於在連接上運行更新,表格是否仍然需要索引?註冊。 ID,ID是唯一生成的20個字符,並且是特定於要求的。 – dmachop

+0

再次..我懷疑這是一個操作,可以完全發生在數據庫中,它只是在Java中完成,因爲這是你喜歡使用的錘子....我可能是錯的,但它發生了很多! –