我正在看 SP_WhoIsActive 在SQL Server 2005上,它告诉我一个会话阻塞了另一个会话--很好。 然而它们都在运行一个SELECT。 一个SELECT怎么会阻塞另一个呢? 它们不是都应该获取共享锁(彼此兼容)吗?
一些更多的细节。两个会话都没有打开的事务数--所以它们是独立的。
这些查询将一个视图与一个表连接起来。
它们是复杂的查询,连接了很多表,结果是10,000次左右的读取。
非常感谢任何见解。
SELECT语句可能会阻塞另一条SELECT语句。你可能会想,既然两者都只获得S锁,那么它们就不应该阻塞。但阻塞发生在各种类型的资源上,而不仅仅是锁。典型的例子就是内存约束。我试着在这里挖出最近一个问题的答案,曾附上一个死锁图,显示到SELECT语句,一个在等待另一个的并行交换操作符内存资源(缓冲器)。
更新了这里是我说的死锁信息的链接。我有关于死锁的数据,但我不明白为什么会出现死锁如果你研究死锁图,你会注意到等待列表中的以下资源。
<exchangeEvent id="Pipe894b0680" WaitType="e_waitPipeGetRow" nodeId="0">
<owner-list>
<owner id="process824df048"/>
</owner-list>
<waiter-list>
<waiter id="process86ce0988"/>
</waiter-list>
</exchangeEvent>
这不是一个锁,是一个 "e_waitPipeGetRow "资源,由一个SELECT拥有,而另一个SELECT正在等待它。关于'查询内并行资源'的一些讨论可以在这里找到。今天的烦人名词:"内查询并行线程"。"查询内并行线程死锁". 虽然大多数讨论都会集中在死锁问题上,但这并不意味着这些资源不能发生普通的阻塞。sys.dm_exec_requests
将有适当的信息在 wait_type
和 wait_resource
.
我认为其是因为第一个选择正在执行行锁表锁。在加入表的时候可以提供NO LOCK提示。