【发布时间】:2011-12-05 18:52:58
【问题描述】:
我有一个带有 Select 的过程,需要很长时间才能完成,大约需要 5 到 10 分钟。
我目前不使用 NOLOCK 作为 MS SQL 数据库引擎的提示。
同时,我们有另一个进程在执行更新和插入到同一个数据库和同一个表中.
第一个进程已经开始,最近以一条消息提前结束
SQLEXCEPTION:事务在锁资源上与另一个进程死锁,并被选为死锁牺牲品。
第一个进程在其他站点以相同的条件运行,但数据库较小,因此所讨论的 select 语句所需的时间要短得多(大约 30 秒左右)。在这些其他站点中,我没有在这些其他站点中收到死锁消息。我也没有在最初出现问题的站点上收到此消息,但是,我认为,随着数据库的增长,我相信我一定已经越过了某个门槛。以下是我的问题:
- 事务执行所需的时间是否会使相关进程更有可能被标记为死锁牺牲品。
- 如果我使用 NOLOCK 提示执行选择,这会解决问题吗?
- 我怀疑作为 select 语句中 WHERE 子句的一部分检查的日期时间字段会导致查找时间变慢。我可以根据该字段创建索引吗?可取吗?
【问题讨论】:
-
对第 1 点的部分回答:不要将死锁与超时混为一谈。如果您遇到超时,那么完成一个事务所涉及的时间可能是另一个异常异常的原因。此外,了解您正在死锁的资源(是索引还是表?)也会很有用。
-
SET DEADLOCK_PRIORITY HIGH ALTER DATABASE dbname SET MULTI_USER;
标签: sql-server deadlock