0

以下 sp:我有一个存储过程,运行时间为 1/2 分钟到 4 小时(在夜间处理期间):

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

我在 Profiler 中连续运行了 2 个晚上的阻止报告,第一次每隔 10 分钟,然后每隔 5 分钟。存储过程永远不会显示为被阻止(但它会阻止其他查询)。

关于优化这个的任何想法?使用连接创建视图会有所帮助吗?(来自 tableB 的 acct_nbr、appl_code、Other_Flag_50)谢谢!

4

2 回答 2

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
于 2012-06-04T16:17:09.590 回答
0

尝试使用rowlock来防止锁定整个表。

update tableA with (rowlock)
...

编辑 不确定其他 RDBMS,但我提供的答案适用于 SQL Server

于 2012-06-04T16:18:13.817 回答