【发布时间】:2016-04-12 11:31:58
【问题描述】:
我是 SQL DBA 角色的新手。我有一个可能每天运行多次的存储过程 (SP1)。它在 table1 上运行昂贵的SELECT,可能需要 15 分钟才能完成。我有另一个存储过程 (SP2),它在 table1 上运行 SELECT,可能需要 1 秒才能完成。
SP1 运行后,SP2 必须等到 SP1 完成!有什么方法可以让我获得运行 SP2 所需的资源(如从 table1 中选择)并在 SP2 完成后将其返回给 SP1?
我不想使用SELECT WITH (NOLOCK),因为其他查询可能会尝试编辑 table1。
【问题讨论】:
-
嗯。你知道答案,但你不想使用它。
-
好吧,我想知道是否有更清洁的方法。
-
所以澄清一下,SP1 采用排他表锁,这样 SP2 在 SP1 完成之前无法从表中读取?你说的“把它还给SP1”是什么意思?回馈什么?
-
是的。将表交还给 SP1 以继续其 SELECT。
-
我们在旧的遗留数据库中遇到了类似的问题。每个人都在试图弄乱索引,
RECOMPILE,甚至是NOLOCK,但最终 SP 被重写并且运行速度快了大约 8 倍......如果你不放弃太多,你可能会发布 SP1 的代码加上结构信息(尤其是索引)。也许有更好的螺丝来调整......
标签: sql sql-server sql-server-2014