gpt4 book ai didi

SQL Server 2012 查询被 LCK_M_IS 阻止

转载 作者:行者123 更新时间:2023-12-04 16:12:53 25 4
gpt4 key购买 nike

我很难理解以下两个查询如何相互阻塞。

运行查询(虽然几乎可以是任何东西):批量插入 [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包含了一条完全不同的表上的索引记录。我的期望是交叉应用会尝试在与运行的其他查询无关的那个索引上运行统计信息。

谢谢

编辑(新):

经过更多测试后,我想我找到了罪魁祸首,但又无法解释。

  1. Bulk Insert Session 在表 [Import].[WorkTable] 上有一个 X 锁
  2. 上面的查询正在检查表 [Import].[AnyOtherTable] 上的索引,但正在请求 [Import].[WorkTable] 上的 IS 锁。我一次又一次地验证上面的查询(在没有交叉应用的情况下运行这些东西时)只返回表 [Import].[AnyOtherTable].
  3. 上的索引。
  4. 现在魔法来了,将 CROSS APPLY 更改为 OUTER APPLY 运行得很好,没有任何锁定问题。

我希望有人能给我解释一下...

最佳答案

问题可能出在您使用的 where 子句上。它应该在内联表中。以下更改可能会有所作为。

FROM    ( SELECT * FROM @indexPart ip
JOIN sys.indexes i (NOLOCK)
ON i.object_id = ip.ObjectId
and i.name = ip.IndexName
WHERE i.is_disabled = 0) i

如果您愿意,这可能会减少传递到交叉应用语句的记录数。

关于SQL Server 2012 查询被 LCK_M_IS 阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com