2012-06-04 36 views
0

以下菌屬: 我有從1/2分鐘至4小時的任何地方運行(夜間處理期間)一個存儲過程:長時間運行SP

update tableA 
set tableA.Other_Flag_50 = isnull(Staging.other_flag_50, 0) 
from tableA 
inner join (
    select acct_nbr, 
     appl_code, 
     Other_Flag_50 
    from tableB 
) Staging on tableA.lnhist_acct_nbr = Staging.acct_nbr 
    and tableA.lnhist_appl_code = Staging.appl_code 

我跑在探查阻斷報告在2晚一排,首先在10分鐘間隔,然後在5分鐘。存儲過程從不顯示爲被阻止(但會阻止其他查詢)。

有關優化這個的任何想法?用聯接幫助創建一個視圖? (來自tableB的acct_nbr,appl_code,Other_Flag_50)謝謝!

+0

你檢查如果表上有任何索引?也許你需要添加一個索引來提高這個語句的性能。你是否也檢查過SSMS中更新語句的執行計劃(假設你使用的是SQL Server)?它會告訴你是否正在進行表格掃描等,並可能幫助識別是否需要索引。 –

+0

你在使用什麼數據庫?我很驚訝這是在做你期望的事情,因爲TableA在update子句和from子句中有相同的別名。我不能發誓SQL從不支持這一點,但我通常不會在更新查詢中提及表名兩次。 –

回答

1

您是否嘗試過直接對tableB進行INNER JOIN?

UPDATE tableA 
SET tableA.Other_Flag_50=isnull(tableB.other_flag_50,0) 
FROM tableA 
INNER JOIN tableB 
    ON tableA.lnhist_acct_nbr = tableB.acct_nbr 
    AND tableA.lnhist_appl_code = tableB.appl_code 
+0

如果這會導致相同的結果,我會懷疑...我會試試看,並讓你知道。謝謝!! – MariusD

+0

這在最近的SQLServer版本中應該不會有任何區別。原始形式不必要的複雜,但在功能上等同。 – joshp

+0

這不起作用 - 它不知道Staging是什麼(Staging.other_flag_50)。 – MariusD

0

嘗試使用rowlock防止鎖定整個表。

update tableA with (rowlock) 
... 

編輯 不清楚其他RDBMS,但我提供了SQL Server的作品答案

+0

我改變了查詢,修改了索引以跨越所有檢索到的列,並且當它在SSMS中作爲查詢運行時,似乎刮掉了幾秒鐘。然而,它昨晚(爲5.8小時)創下了紀錄。我知道有幾個報告同時在同一張桌子上運行,所以唯一的解釋是,這是持續的。我會嘗試下一步(rowlock)。 – MariusD