2012-06-04 44 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