【问题标题】:Session blocks itself会话阻止自己
【发布时间】:2020-02-02 01:48:54
【问题描述】:

我正在运行一个执行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_table(field1)PK_table(field2,field1)

sp_who2 看起来像这样

版本 -

Microsoft SQL Server 2017 (RTM-CU16) (KB4508218) - 14.0.3223.3 (X64)
2019 年 7 月 12 日 17:43:08 版权所有 (C) 2017 Microsoft Corporation Windows Server 2016 Standard 10.0 上的标准版(64 位) (内部版本 14393:)(管理程序)

【问题讨论】:

  • 这是由于线程协调(CXPACKET 等待)并行查询。

标签: sql-server tsql


【解决方案1】:

您可以先尝试摆脱子查询。如果这不起作用,请尝试添加下面的 OPTION (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)

【讨论】:

  • 并行运行好还是不运行好?
  • 一般来说这很好,所以如果你能以某种方式重组查询,这样它就不会被自己绊倒,那将是理想的。这就是为什么我建议首先消除子查询。我的猜测是您的视图引用了该表,因此不同的线程正在锁定该表。您还可以尝试用视图的查询内容替换视图(不使用括号中的子查询,只使用表连接)。这可能有助于查询引擎制定更好的计划。
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2021-12-30
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多