Sql server 会话本身会阻塞
我正在运行一个执行Sql server 会话本身会阻塞,sql-server,tsql,Sql Server,Tsql,我正在运行一个执行MERGE的过程sp_who2显示会话自身阻塞。这怎么可能?我的sp看起来像这样 CREATE PROC [dbo].[sp] as BEGIN MERGE dbo.table as target USING ( select field1, field2 from dbo.view ) as source (field1, field2) ON target.field1=source.fie
MERGE
的过程sp_who2
显示会话自身阻塞。这怎么可能?我的sp看起来像这样
CREATE PROC [dbo].[sp] as
BEGIN
MERGE dbo.table as target
USING (
select field1, field2
from dbo.view
) as source (field1, field2)
ON target.field1=source.field1 and target.field2=source.field2
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN NOT MATCHED BY TARGET THEN
INSERT (field1, field2) VALUES (source.field1, source.field2);
END
dbo.table
是一个巨大的表。具有IX_表(字段1)
和PK_表(字段2,字段1)
sp_who2
看起来像这样
CREATE PROC [dbo].[sp] as
BEGIN
MERGE dbo.table as target
USING (
select field1, field2
from dbo.view
) as source (field1, field2)
ON target.field1=source.field1 and target.field2=source.field2
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN NOT MATCHED BY TARGET THEN
INSERT (field1, field2) VALUES (source.field1, source.field2);
END
版本-
Microsoft SQL Server 2017(RTM-CU16)(KB4508218)-14.0.3223.3(X64)2019年7月12日17:43:08版权所有(C)2017微软公司 Windows Server 2016标准10.0上的标准版(64位) (构建14393:)(虚拟机监控程序)
您可以先尝试删除子查询。如果不起作用,请尝试在下面添加
选项(MAXDOP 1)
,以从查询中删除并行性
MERGE dbo.table as target
USING dbo.view AS source
ON target.field1=source.field1 and target.field2=source.field2
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN NOT MATCHED BY TARGET THEN
INSERT (field1, field2) VALUES (source.field1, source.field2)
OPTION (MAXDOP 1)
这是由于并行查询的线程协调(CXPACKET等待)造成的。但是,使用并行还是不使用并行更好?通常情况下,这很好,因此,如果您能够以某种方式重新构造查询,使其不会被自己绊倒,这将是理想的。这就是为什么我建议先取消子查询。我猜您的视图引用了表,因此不同的线程锁定了表。您还可以尝试用视图的查询内容替换视图(不使用括号中的子查询,只使用表连接)。这可能有助于查询引擎设计出更好的计划。