Sql server 使用SQL Server统计直方图估计范围谓词

Sql server 使用SQL Server统计直方图估计范围谓词,sql-server,database-performance,query-performance,database-optimization,Sql Server,Database Performance,Query Performance,Database Optimization,我想问一下SQL Server如何在下面的查询中估计这些行,如果它使用直方图来计算估计行,它是如何做的。如有任何提示或链接,我们将不胜感激 use AdventureWorks2012 go select * from sales.SalesOrderDetail where SalesOrderID between 43792 and 44000 option (recompile) SQLSERVER构造列的统计信息以分析该列中的数据分布,并基于该直方图得出估计值 让我们举一个小例子

我想问一下SQL Server如何在下面的查询中估计这些行,如果它使用直方图来计算估计行,它是如何做的。如有任何提示或链接,我们将不胜感激

 use AdventureWorks2012
go
select *
from sales.SalesOrderDetail 
where SalesOrderID between 43792 and 44000
option (recompile)


SQLSERVER构造列的统计信息以分析该列中的数据分布,并基于该直方图得出估计值

让我们举一个小例子来进一步了解数据

drop table t1

create table t1
(
id int 
)

insert into t1
select top 300 row_number() over(order by t1.number) as N
from   master..spt_values t1 
       cross join master..spt_values t2

go 3



select * from t1 where id=1



dbcc show_statistics('t1','_WA_Sys_00000001_29572725')
dbcc给了我下面的直方图

   RANGE_HI_KEY RANGE_ROWS  EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
1                   0          3          0                1
3                   3          3          1                3
4                   0          3          0                1
6                   3          3          1                3
8                   3          3          1                3
10                  3          3          1                3
上面是dbcc输出的一小段。在开始解释这些内容之前,让我们先了解一下数据是如何分布在表中的

从1到300有300行,重复了3次。所以总行数是900

现在让我们了解这些列的含义

范围\u高\u键

sql server使用此列中的值作为顶键来构造直方图,因为直方图仅限于200步。它选择 用于构造直方图的行。这将限制为200步。在这种情况下,值为1、3、4、6,依此类推

范围\u行

此数字显示步骤中大于上一个top key和当前top key但不等于两者的行数


行>1和1以及SQLSERVER构造列的统计信息以分析该列中的数据分布,并基于该直方图得出估计值

让我们举一个小例子来进一步了解数据

drop table t1

create table t1
(
id int 
)

insert into t1
select top 300 row_number() over(order by t1.number) as N
from   master..spt_values t1 
       cross join master..spt_values t2

go 3



select * from t1 where id=1



dbcc show_statistics('t1','_WA_Sys_00000001_29572725')
dbcc给了我下面的直方图

   RANGE_HI_KEY RANGE_ROWS  EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
1                   0          3          0                1
3                   3          3          1                3
4                   0          3          0                1
6                   3          3          1                3
8                   3          3          1                3
10                  3          3          1                3
上面是dbcc输出的一小段。在开始解释这些内容之前,让我们先了解一下数据是如何分布在表中的

从1到300有300行,重复了3次。所以总行数是900

现在让我们了解这些列的含义

范围\u高\u键

sql server使用此列中的值作为顶键来构造直方图,因为直方图仅限于200步。它选择 用于构造直方图的行。这将限制为200步。在这种情况下,值为1、3、4、6,依此类推

范围\u行

此数字显示步骤中大于上一个top key和当前top key但不等于两者的行数


第1行和第1行,谢谢你的支持,你的答案并不是我所期望的,但从你的提示中,我可以自己猜出答案。实际上,我的问题还不够清楚,真正的问题是当一个谓词位于两个步骤(两个RANGE\u HI\u键值)之间时,我们如何计算估计的行数?查询看起来像Selectfrom sales.SalesOrderDetail,其中SalesOrderID<43660我说“猜测”,因为我没有发现任何文章讨论过这一点,但我发现SQL Server可能会使用插值方法来做???如果我们无法确切知道SQL Server使用的公式是什么?感谢您的支持,你的答案并不是我所期望的,但从你的暗示中,我可以自己猜出答案。实际上,我的问题还不够清楚,真正的问题是当一个谓词位于两个步骤(两个RANGE\u HI\u键值)之间时,我们如何计算估计的行数?查询看起来像是select*from sales.SalesOrderDetail,其中SalesOrderID<43660我说“猜测”,因为我没有发现任何文章谈论这一点,但我发现SQL Server可能会使用插值方法来做???如果我们无法确切知道SQL Server使用的公式是什么?