行计数估计未使用 SQL Server 2008 多列统计信息

Posted

技术标签:

【中文标题】行计数估计未使用 SQL Server 2008 多列统计信息【英文标题】:SQL Server 2008 multi columns statistics not being used by row count estimation 【发布时间】:2009-12-27 12:58:01 【问题描述】:

我有一个包含 A 列和 B 列的表,它们的相关性如下:

A == 1 => B == 3
A == 2 => B == 0
A == 3 => B == 7

带有=>的意思是意味着高概率。我想这样查询:

where A = 2 and B = 3 --very few rows should match

所以我创建了 (A, B) 的统计信息。但是查询优化器完全错误地估计了行数 10 倍。有什么想法吗?联合直方图应该允许非常精确的估计。顺便说一句:基数(A)= 10,基数(B)= 5

【问题讨论】:

你可以接受更多的答案,也许 看看我问的问题。我已经接受了所有解决我问题的答案。我只是碰巧问了非常棘手的问题;-) 【参考方案1】:

我怀疑优化器忽略了统计信息,因为整个查询都很重要,而不仅仅是 WHERE 子句。或者你有 SELECT *.或者采样率太低(你用了FULLSCAN吗?)

如果您创建一个具有索引统计信息的索引会怎样?是否也包含内含物以使其覆盖?

我从未创建过自己的列统计信息(除非图形查询计划提到了它)。如果我需要创建它们,索引很可能会更好地服务于我的目的

编辑:

Another SO question: SQLServerPedia article

【讨论】:

我确实使用了 FULLSCAN。创建索引后,估算值会变得更好。 查询是否被索引完全覆盖?对索引进行 FULLSCAN(重建)?

以上是关于行计数估计未使用 SQL Server 2008 多列统计信息的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 Management Studio 的缺失索引功能

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

SQL Server 2008 R2:计数字符匹配

Sql Server 2008 MERGE - 获取计数的最佳方式

SQL Server 2008 R2 子查询分组、求和和计数

合并列并获取计数 SQL Server 2008