我有一个表Customers,其中一列是Country。国际客户很少,因此该列的90%的行具有空值。有一个存储过程来获取国际客户(选择来自客户,其中Country不为空)。
我想优化此存储过程的性能。我有什么最好的选择:创建非聚集的筛选索引或创建筛选的统计信息? 如果有人能向我解释统计对象是如何不同的frm索引,我也会感激不尽。到目前为止,我认为在创建索引时会自动创建统计信息。
由于
答案 0 :(得分:0)
SQL Server中的传统索引是b树结构,可根据键值和/或顺序提供对行的高效访问。过滤的索引会减少存储在b-tree索引中的行数,从而进一步提高效率。
SQL Server维护有关所有b树索引的键值分布的统计信息,以便它可以更准确地估计合格行的数量。基于成本的优化器使用此信息为查询生成最有效的执行计划,并帮助决定是否使用特定查询的索引。
统计信息没有b树结构来帮助定位数据。但是,它们确实提供了基数统计信息,优化程序可以使用这些统计信息来开发更准确的行计数估计值,从而提高查询计划的效率。
答案 1 :(得分:0)
如果是我,我会从过滤后的统计信息开始,看看它是否为您的查询提供了“足够好”的性能。由于它们不是事务性维护的(即它们不会随着每次插入/更新/删除操作而改变),因此从OLTP的角度来看它们更便宜。但是,您可能会发现仅需要为数据访问路径建立索引。
答案 2 :(得分:0)
我没有看到“单独”创建过滤统计数据的用处。我宁愿建议一个非群集过滤索引。
为什么?
如果SQL Server运行的查询需要一些统计信息,如果没有,则会创建它。因此,所有带有_WA_XXXXXXX格式的统计信息都是由SQL Server自动创建的。
如果没有索引支持统计数据并没有太多用处。在统计信息的帮助下,优化器将知道数据的选择性。大!!但问题是无法做到这一点。
为什么?,因为没有索引以最佳方式获取数据。因此,创建过滤索引将导致创建过滤后的统计信息。根据索引定义的质量,它主要是索引搜索。减少IO,减少时间,减少锁定和阻塞等。
现在假设您有统计信息,您需要记住过滤统计数据存在的一些问题并对其采取一些措施。过滤后的统计信息很快过时,因为它们的方式统计信息由SQL Server算法更新。除了创建过滤的NC索引之外,如果您有一个作业设置来定期更新过滤的统计数据,那将会很有帮助。
要了解有关过滤统计数据过期问题的更多信息,请阅读Kimberley Tripp的博客。 SQL Server世界的超级知识专家!