自成长键列统计信息的处理方法

自成长键列统计信息的处理方法
这篇文章解释了如何处理自我在文字编码形式越来越多的键列的统计。我们都知道SQL Server中的每个对象都有一个相关的统计直方图,直方图使用多个步骤来描述指定列的数据分布的直方图图,SQL Server 200最大步支持,但当你查询的数据范围在直方图中的最后一步,这是个问题。让我们看看下面的代码复制这种情况
创建一个简单的订单表
订单表

订单日期不为空,
COL2 int不空,
col3 int不空

-在表上创建一个非唯一的聚集索引
创建聚集索引idx_ci订单(订单)
插入31465行从adventureworks2008r2数据库
插入订单(订单、COL2,col3)选择订单,CustomerID TerritoryID,从adventureworks2008r2.sales.salesorderheader
重新构建聚集索引,以便得到新的统计数据。
在直方图的最后值2008-07-31。
改变订单指数idx_ci重建
在直方图最后一步之后插入200个额外的行*
插入订单(订单、COL2,col3)
值('20100101 ',1, 1)
二百
重新生成索引后,我们看直方图,我们发现的最后一步是2008-07-31。

复制代码代码如下所示:

DBCC show_statistics('dbo。订单,'idx_ci)与直方图

正如您所看到的,在最后一步之后,我们插入了200个额外的记录。在这种情况下,直方图实际上并不能反馈实际的数据分布,但仍然需要SQLServer来执行基数。

复制代码代码如下所示:

SQL Server 2005 SP1 - SQL Server 2012
在SQL Server 2014之前,处理这个问题的基数非常简单:SQL Server的估计行数为1,您可以从下面的图片中看到它。

单击工具显示包含实际的执行计划并执行下列查询:

复制代码代码如下所示:

选择dbo.订单订单= '2010-01-01

从SQL Server 2005 SP1,查询优化器可以标记1列为自我成长(升序)克服刚刚介绍的局限。如果你更新统计信息3次对象与自我成长的列值,该列将被标记为一个自我成长柱。为了看看有没有自增长的列标签,您可以使用跟踪标记2388。当你启用这个跟踪标签,dbcc show_statistics输出改变,并有一个额外的列返回。

复制代码代码如下所示:

DBCC TRACEON(2388)

DBCC show_statistics('dbo。订单,'idx_ci)

下面的代码将统计数据更新3次,每次都在带有自增长键列值的聚合索引末端插入行。
第一更新统计->表与一个完全的
与完全更新统计订单
在直方图最后一步之后插入200个额外的行*
插入订单(订单、COL2,col3)
值('20100201 ',1, 1)
二百

第二更新统计->表与一个完全的
与完全更新统计订单
在直方图最后一步之后插入200个额外的行*
插入订单(订单、COL2,col3)
值('20100301 ',1, 1)
二百

第三更新统计->表与一个完全的
与完全更新统计订单

然后,当我们执行DBCC show_statistics命令,你会看到SQL Server告诉柱上升。

复制代码代码如下所示:

DBCC TRACEON(2388)

DBCC show_statistics('dbo。订单,'idx_ci)
现在,当你再次执行查询不在直方图的范围,这是不能改变的。为了使用一个标签作为一个自我成长的关键列,您必须启用另一个跟踪标签-2389.if启用跟踪标签,查询优化器是密度矢量(密度矢量)为基数计算。
现在我们查询新插入的当前不存在的范围。
使用跟踪标记2389,查询优化器使用密度向量来制作。
从订单中选择*
在'20100401 OrderDate =
(编译选项querytraceon 2389)

看看桌子的电流密度:

复制代码代码如下所示:

DBCC traceoff(2388)

DBCC show_statistics('dbo。订单,'idx_ci)
电流表密度是0.0008873115,所以查询优化器估计的行数28.4516:0.0008873115 *(32265-200)。
这不是最好的结果,但它比估计的线路数要好1。

(这里有个问题,我是SQL Server 2008R2,测试线或1,估计的数字我不知道为什么,我希望朋友们解释一下,谢谢!)
SQL Server 2014

在SQL Server 2014中引入了一个新的功能,新的基数,新基数计算是自我成长的关键问题很简单:它默认不使用任何标记跟踪,并使用统计信息对象的密度矢量做基数计算。以下查询可以跟踪的2312标签的基数数的计算运行相同的查询。
1——使用新的基数估计程序,SQL Server估计集群中的28.4516行
2从订单中选择*
3在OrderDate = '20100401
4个选项(重新编译,querytraceon 2312)


当我们查看这里的基数计算时,您将看到查询优化器再次估计行数为28.4516,但这次表中没有增加。这是SQL Server 2014的自包含函数

(SQL Server 2014失败,估计行数为1…)
在本文中,我向您展示了SQL查询优化器如何处理自增长键的问题。在SQL Server 2014之前,需要启用2389个跟踪标记以获得更好的基数计算。在这种情况下,它将被标记为自增长(升序). SQL Server 2014,查询优化器默认使用密度向量计算基数,这非常方便.我希望您对此有所了解,您将更好地了解如何处理SQL Server中的自增长密钥列。

我希望开悟。谢谢您.
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部