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

时间:2014-09-20 17:20:19

标签: sql-server sql-server-2008 sql-server-2012

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

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

由于

3 个答案:

答案 0 :(得分:0)

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

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

统计信息没有b树结构来帮助定位数据。但是,它们确实提供了基数统计信息,优化程序可以使用这些统计信息来开发更准确的行计数估计值,从而提高查询计划的效率。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我没有看到“单独”创建过滤统计数据的用处。我宁愿建议一个非群集过滤索引。

为什么?

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

  2. 如果没有索引支持统计数据并没有太多用处。在统计信息的帮助下,优化器将知道数据的选择性。大!!但问题是无法做到这一点。

  3. 为什么?,因为没有索引以最佳方式获取数据。因此,创建过滤索引将导致创建过滤后的统计信息。根据索引定义的质量,它主要是索引搜索。减少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/