我很难理解以下两个查询如何会互相阻塞。
正在运行的查询(几乎可以是任何内容): 插入批量[Import].[WorkTable] ...
同时,我试图运行以下SELECT查询:
SELECT *
FROM ( SELECT * FROM @indexPart ip
JOIN sys.indexes i (NOLOCK)
ON i.object_id = ip.ObjectId
and i.name = ip.IndexName) i
CROSS
APPLY sys.dm_db_index_physical_Stats(db_id(), i.object_id,i.index_id,NULL,'LIMITED') ps
WHERE i.is_disabled = 0
第二个查询被第一个查询阻塞,并显示LCK_M_IS作为等待信息。重要的信息是,临时表@indexPart包含一个完全不同的表上索引的一条记录。我期望交叉应用程序尝试运行该单个索引的统计信息,而该索引与正在运行的其他查询无关。
谢谢。
编辑(新):
经过几次测试后,我认为自己找到了罪魁祸首,但仍然无法解释。
- 批量插入会话在表 [Import] .[WorkTable] 上拥有X锁。
- 上述查询正在检查表 [Import] .[AnyOtherTable] 上的索引,但是请求在 [Import] .[WorkTable] 上获得IS锁定。我一再验证上述查询(在没有交叉应用的情况下运行该内容)仅返回表[Import].[AnyOtherTable]上的一个索引。
- 现在,这里出现了魔法,将交叉应用程序更改为外部应用程序,就可以完全通过而没有任何锁定问题。