来自我们日志的错误消息(此处添加了换行符):
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!)
请寻求智慧。
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