2012-07-05 80 views
0

試圖更新包含放在庫存數據表時,我面臨一個很大的問題加入了含表的產品分類加盟。此操作需要很長時間才能執行。長時間exection在SQL Server 2008

表dw_giacenze(具有等於T flag_nomatch參數)一上內與ecat_key字段dw_key_prodž加入放置。 a包含高達3千萬記錄,z 150k記錄。 執行時間超過2小時。

在我正在使用的更新查詢之下。

update dw_giacenze 
set cate_ecat_key = z.cate_ecat_key, 
     sottocat_ecat_key = z.sottocat_ecat_key, 
    marchio_key = z.marchio_key, 
    sottocat_bi_key = z.sottocat_bi_key, 
    gruppo_bi_key = z.gruppo_bi_key, 
    famiglia_bi_key = z.famiglia_bi_key, 
    flag_nomatch = NULL 
from dw_giacenze a 
    inner join dw_key_prod z on 
     z.ecat_key = a.ecat_key 
where 
    a.flag_nomatch = 'T'; 

任何人都可以幫助我優化它嗎? 在此先感謝!

恩里科

+0

顯示您的查詢計劃。菜單「查詢」,「顯示預計執行計劃」。 –

+0

dw_giacenze是否有許多需要更新的索引?具有相同表和條件的SELECT查詢是否也需要很長時間才能運行?你在這兩個表中的ecat_key上有任何索引,並且在flag_nomatch上有索引嗎? –

+0

嗨大衛,我進行查詢執行計劃和SQL Server說/ * 缺少從SQLQuery4.sql索引詳細信息 - 46.51.199.197.EURDB-DEV(EUR-DEV(53)) 查詢處理器估計,實現以下指標可以將查詢成本提高96.6899%。 */ /* USE [EURDB-DEV] GO CREATE NONCLUSTERED INDEX ON [DBO]。[dw_giacenze]([flag_nomatch]) INCLUDE([ecat_key [<缺失索引,sysname類型,名稱>] ]) GO */ – user1085912

回答

0

我建議聚焦於a.flag_nomatch = 'T'。

一個偉大的方式得到了什麼事情的一個非常清晰的圖像是使用SQL Server Profiler。如果這表明你的讀取等於表中的行數,那肯定是一個問題。在flag_nomatch上添加一個索引。

或者,你可以分開這一點,並單獨更新的東西(先從)

UPDATE dw_giacenze 
    set sottocat_ecat_key = (SELECT sottocat_ecat_key 
          FROM dw_key_prod 
          WHERE dw_key_prod.ecat_key = dw_giacenze.ecat_key) 
where 
    dw_giacenze.flag_nomatch = 'T'; 

我也注意到,在您所設定的語句的第一個參數實際上是在你的加入同一個參數。這意味着你將它設置爲相同的確切值,所以你應該可以刪除它。