我试图理解多列索引和统计数据,下面是我的实际示例:
Table: TaskExecutions, size=~1 million rows.
Query SARGS: TaskExecStatusID = 3 AND TaskExecUpdatedDate IS NULL
Distribution:: TaskExecStatusID: 1=160k rows, 2=370k rows, 3=560k rows.
TaskExecUpdatedDate: Null=171k rows.我有一个索引(TaskExecStatusID,TaskExecUpdatedDate),
我的问题/问题是,上述查询的估计行数为256行,实际行数为560 K。
我想知道这两个数字为何有这么大的分别?
统计数据是最新的,索引的统计数据是多列统计数据。我尝试在索引/统计上创建(TaskExecUpdatedDate,TaskExecStatusID),而估计/实际值没有变化。
如果我运行一个DBCC SHOW_Statistics,密度部分中有两个列,而直方图没有。SQL server是否为多列统计信息中的列组合生成直方图?
戴夫
发布于 2012-01-01 15:18:37
你其实有几个问题要问,所以我会逐个说出来。
我的问题/问题是,上述查询的估计行数为256行,实际行数为560 K。我想知道这两个数字为何有这么大的分别?
为了回答这个问题,我们首先需要的是查询的实际执行计划。在中,您可以通过单击“查询”,包括“实际执行计划”来获得此结果。运行查询,单击“执行计划”选项卡,右键单击空白中的任何位置,单击“另存计划为”。保存它,并将其发布到某个地方,供人们下载和检查。
接下来我们需要的是DBCC SHOW_STATISTICS对该表上的统计数据的输出。您已经暗示了输出,这是一个很好的开始,但是原始输出将帮助我们准确地理解正在发生的事情。
如果我运行一个DBCC SHOW_Statistics,密度部分中有两个列,而直方图没有。SQL server是否为多列统计信息中的列组合生成直方图?
不是的。
我有一个索引(TaskExecStatusID,TaskExecUpdatedDate),
如果经常在示例中使用查询(使用TaskExecUpdateDate为NULL),则可以签出筛选过的索引。它们是Server 2008中的一个新特性,基本上允许您在索引中添加where子句。
http://sqlfool.com/2009/04/filtered-indexes-what-you-need-to-know/
https://dba.stackexchange.com/questions/8067
复制相似问题