SQL 2016 Standard SP1 - 在同一SPID(Exchange事件)上{DEADLOCK

时间:2017-03-10 00:27:36

标签: sql-server parallel-processing deadlock sql-server-2016

来自我们日志的错误消息(此处添加了换行符):

dbo.usp_Replenish_Maintenance_Cleanup : END STEP Table replenish.ProjectionXML;
ERROR : Transaction (Process ID 59) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.,
ERROR NUMBER:1205 during Copy operation. Execution End Time: 2017-03-09 01:17:36.6866667. (Execution Duration: 6 seconds.)

这是发生这种情况的第二个晚上,它只在这个平台上运行了两次! SQL 2014 SP2 CU3 Developer的 完全相同的问题 虽然在同一个表的500K行上。

平台是一个2x12核心,256GB,使用512GB的BPE,运行2016 SP1。每个Bob Dorr在Soft-NUMA(pssql post)上的“It running faster”帖子中,MAXDOP为12。第一次运行时MAXDOP = 8。

显式事务在proc中部分启动。如果检测到@@ TRANCOUNT>存储过程将无法运行启动时为0。

该语句非常简单 - 动态SQL,带有名称替换:

SELECT r.*
  INTO '+@nFullCleanupTableName+'
  FROM '+@nFullTableName+' r WITH (TABLOCKX)
       INNER JOIN replenish.ActiveEngineRun aer
               ON r.RunID         = aer.RunID
              AND r.InventoryID   = aer.InventoryID
              AND r.SupplyChainID = aer.SupplyChainID
       INNER JOIN tbl_Inventory i
               ON i.InventoryID = r.InventoryID
 WHERE i.ActiveFlag = 1';

在TRAN中有压缩,默认约束,创建非cl索引和重命名语句(不按此顺序)。

该表有48M行消耗193GB。

数据文件有216GB免费。

我有死锁XDL文件。

Solarwinds DPA仅显示一个SPID:1名受害者,16名幸存者。它的知识库说:

兑换事件锁 “交换事件”资源表示查询计划中存在并行操作符。

当大型查询操作被“并行化”时,会创建多个需要协调和通信其活动的查询内子线程。为了适应查询内并行性,SQL Server采用了这种类型的锁。

粒度:N / A

死锁解决方案

大多数查询内并行性死锁都被视为错误,因为从技术上讲,会话不应阻塞自身,并且通常通过以下方式解决: 确保SQL Server位于最新的Service Pack上。 在死锁中看到交换事件锁定是不常见的。但是,如果您经常看到它,那么请寻找最小化查询并行性的方法。例如: 添加索引或修改查询以消除并行性的需要。不使用索引的大型扫描,排序或连接是典型的罪魁祸首。 使用MAXDOP选项强制执行查询以运行单线程。您可以通过在查询结尾添加“OPTION(MAXDOP 1)”来完成此操作。如果无法修改查询,请考虑对计划指南应用提示。

- 报价结束

这个问题对我来说没什么意义。对于这张表的插入,我唯一可以设置MAXDOP = 1吗?还有5个其他表,都是压缩的,其中一个表的行数是3倍,每个表都成功。也许它是nvarchar(max)列(off page)给我的问题(包含XML)...

(编辑:仅对一个表进行了修改,使用OPTION(MAXDOP 1)运行到COMMIT!

请寻求智慧。

更新死锁图形图像enter image description here和DDL

CREATE TABLE [replenish].[ProjectionXML](
    [InventoryID] [int] NOT NULL,
    [SupplyChainID] [int] NOT NULL,
    [RunID] [uniqueidentifier] NOT NULL,
    [AdhocRunDate] [datetime] NULL,
    [ProjectionData] [nvarchar](max) NULL,
    [RowStatusID] [smallint] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [IX_replenish_ProjectionXML_KeyColumns] ON [replenish].[ProjectionXML]
(
    [InventoryID] ASC,
    [SupplyChainID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
GO

ALTER TABLE [replenish].[ProjectionXML] ADD  CONSTRAINT [DF_replenish_ProjectionXML_RowStatusID]  DEFAULT ((1)) FOR [RowStatusID]
GO

0 个答案:

没有答案