什么是首选?创建统计信息或创建非聚集过滤索引?

Posted

技术标签:

【中文标题】什么是首选?创建统计信息或创建非聚集过滤索引?【英文标题】:What is preferred? Creating a statistics or creating a non clustered filtered index? 【发布时间】:2014-09-20 17:20:18 【问题描述】:

我有一个表客户,其中一列是国家。国际客户很少,因此 90% 的行的该列具有空值。有一个获取国际客户的存储过程(从 Country 不为空的客户中选择 ...)。

我想优化这个存储过程的性能。我有什么最好的选择:创建非聚集过滤索引或创建过滤统计信息? 如果有人能向我解释统计对象是如何不同的frm索引,我将不胜感激。到目前为止,我认为统计数据是在我们创建索引时自动创建的。

谢谢

【问题讨论】:

90% 有空?那么您 90% 的客户不是来自任何国家/地区吗?你和来自外太空的外星人打交道?它不应该为空(根据 SQL 标准表示“未知”),而是您自己的国家/地区。 @TomTom : 桌子就是这样设计的.. :) 我没有设计桌子。 我必须在对前端应用程序影响最小的情况下完成这项工作 【参考方案1】:

SQL Server 中的传统索引是 b 树结构,可根据键值和/或排序提供对行的有效访问。过滤索引减少了存储在 b-tree 索引中的行数,从而进一步提高了效率。

SQL Server 维护有关所有 b 树索引的键值分布的统计信息,以便它可以更准确地估计符合条件的行数。基于成本的优化器使用此信息为查询生成最有效的执行计划,并帮助决定是否为特定查询使用索引。

统计数据没有便于定位数据的 b 树结构。但是,它们确实提供了优化器可以用来开发更准确的行计数估计的基数统计信息,从而产生更有效的查询计划。

【讨论】:

【参考方案2】:

如果是我,我会从过滤后的统计数据开始,看看它是否为您的查询提供了“足够好”的性能。由于它们不是以事务方式维护的(即它们不会随着每次插入/更新/删除操作而更改),因此从 OLTP 的角度来看它们更便宜。不过,您可能会发现您确实需要一个索引来仅用于数据访问路径。

【讨论】:

【参考方案3】:

我认为“单独”创建过滤统计信息没有多大用处。我宁愿建议使用非聚集过滤索引。

为什么?

    如果 SQL Server 运行需要一些统计信息的查询,如果没有,它会创建它。所以所有那些 _WA_XXXXXXX 格式的统计信息都是由 SQL Server 自动创建的。

    如果没有索引支持,仅拥有统计信息并没有多大用处。在统计信息的帮助下,优化器将知道数据的选择性。伟大的!!但问题是对此无能为力。

为什么?,因为没有索引可以以最佳方式获取数据。因此,过滤索引的创建将导致过滤统计信息的创建。根据索引定义的质量,它主要进行索引搜索。导致更少的 IO、更少的时间、更少的锁定和阻塞等。

现在您已经掌握了统计信息,您需要牢记过滤统计信息存在一些问题,并采取相应措施。过滤的统计信息很快过时,因为它们的统计信息是由 SQL Server 算法更新的。除了创建过滤的 NC 索引之外,如果您有一个作业设置来定期更新过滤的统计信息,这将很有帮助。

要了解有关过滤统计信息过期问题的更多信息,请阅读 Kimberley Tripp 的博客。 SQL Server 世界的超级知识专家!

http://www.sqlskills.com/blogs/kimberly/filtered-indexes-and-filtered-stats-might-become-seriously-out-of-date/

【讨论】:

以上是关于什么是首选?创建统计信息或创建非聚集过滤索引?的主要内容,如果未能解决你的问题,请参考以下文章

ES 聚合索引简介

SQLServer之创建唯一聚集索引

学习笔记-----统计信息

为批量删除操作禁用和启用或删除和创建非聚集索引

数据库怎样创建一个唯一聚集索引

第十二章——SQLServer统计信息——创建和更新统计信息