Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 会话本身会阻塞_Sql Server_Tsql - Fatal编程技术网

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等待)造成的。但是,使用并行还是不使用并行更好?通常情况下,这很好,因此,如果您能够以某种方式重新构造查询,使其不会被自己绊倒,这将是理想的。这就是为什么我建议先取消子查询。我猜您的视图引用了表,因此不同的线程锁定了表。您还可以尝试用视图的查询内容替换视图(不使用括号中的子查询,只使用表连接)。这可能有助于查询引擎设计出更好的计划。