删除过滤的统计信息会导致死锁

Posted

技术标签:

【中文标题】删除过滤的统计信息会导致死锁【英文标题】:dropping filtered statistics causes deadlocks 【发布时间】:2013-10-04 08:55:24 【问题描述】:

我们有一个大型数据仓库数据库,我们不断地在 5 个不同的表中插入新行,位于 b 树的左侧(编辑:右侧)(=在表的末尾)

这意味着对于新数据,普通统计数据很快就会过时。 所以我们改变了我们的插入过程来做一个 CREATE STATISTICS FST_xxx 带有覆盖最新两百万行的 WHERE 子句。

这确保了我们不会得到错误的执行计划。 现在我们被数百个这样的人困住了。 我们有一个每天运行一次的清理作业,它会删除不需要的统计信息。

但这会导致很多死锁。

有没有办法在不导致死锁的情况下禁用过滤统计信息或删除过滤统计信息?

(编辑:)该表聚集在 Bigint Identity(1,1) asending 上。

【问题讨论】:

【参考方案1】:

您能否说明插入行的位置?您说的是 b-tree 的左侧,但您也说的是表的末尾。假设这是您正在谈论的聚集索引是否正确?而不管是否聚集,索引键是升序的吗?谢谢。

【讨论】:

对不起,我的错误。是的,它在右手边,并且表格是聚集在 Bigint Identity(1,1) 上的。 您可能需要考虑使用跟踪标志 2389。这里有更多信息:blogs.msdn.com/b/ianjo/archive/2006/04/24/582227.aspx 和 simple-talk.com/sql/database-administration/… 与任何跟踪标志一样,我建议在将其投入生产之前进行测试。 非常感谢您提供这两个链接。我会调查这些跟踪标志。【参考方案2】:

为什么不尝试更新统计信息而不是每次都创建一个新统计信息?

【讨论】:

表很大,提取需要相当长的时间,并且会产生很多额外的I/O

以上是关于删除过滤的统计信息会导致死锁的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的统计信息问题

为啥过滤统计信息被忽略

SQL执行异常系列之——统计信息不准

在包内多次运行收集表统计信息会导致性能问题

统计信息锁住导致收集统计信息失败引起sql执行异常

数据库参数调优--自动更新统计信息