列存储聚集索引 - 死锁问题 (SQL Server)

Posted

技术标签:

【中文标题】列存储聚集索引 - 死锁问题 (SQL Server)【英文标题】:Columnstore Clustered Index - Deadlock issue ( SQL Server ) 【发布时间】:2018-09-23 02:56:30 【问题描述】:

我正在将数据提取到 SQL Server 中的表 A [使用列存储聚集索引]。 “INSERT BULK”有4个并行线程 写入表,我得到一个死锁错误:

事务(进程 ID)在锁定资源上与另一个进程死锁,并已被选为死锁牺牲品。重新运行事务。

经过研究,我发现聚集列存储索引通常会出现死锁问题,但无法弄清楚解决方案。你能建议吗 可以做什么?

【问题讨论】:

如果将查询的最大并行度 (MAXDOP) 设置为 1,则不会出现此问题。以下链接可能会有所帮助--support.microsoft.com/en-in/help/4057055/… 从 system_health XE 跟踪中发布 deadlock_xml。在 SSMS 对象资源管理器中,Management-->Extended Events-->Sessions-->system_helath-->package0.event_file 并双击查看事件。然后从顶部菜单栏中选择 Extended Events...-->Filters 并指定name = xml_deadlock_report 以查看死锁事件。然后选择一个并复制 xml 值以添加到您的问题中。 我需要从管理员那里得到它。我自己无法访问。 另外请提供 SQL Server 版本(` select @@version`)。 【参考方案1】:

检查您的数据库是否开启了快照隔离级别。对我来说,将快照隔离级别更改为关闭解决了 Columnstore 表上的死锁问题。

【讨论】:

以上是关于列存储聚集索引 - 死锁问题 (SQL Server)的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL、聚集列存储索引、“TOP”性能

当 where 子句列中没有聚集索引时,并行更新导致死锁

SQL Server 2016新特性:列存储索引新特性

在 SQL Server 2014 中使用聚集列存储索引时,具有大量列的表是不是仍然是反模式?

SQL Server 2016 —— 聚集列存储索引的功能增强

在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引