用SQL Server索引密度对行数进行评估


  本文标签:SQL Server索引密度

  此文章主要向大家介绍的是正确使用SQL Server索引密度对行数(Estimating Rows Using the Index Statistics)来进行评估的实际操作步骤,以及对优化器是如何正确使用SQL Server索引密度来决定一个索引的效果的描述  。

  当在一个范围内查找一个索引值或者键中存在重复值时,SQL Server会使用直方图信息  。考虑下面关于bigpubs2000数据库中的sales表中查询:

  

  Sql代码

  

  1. Select * from sales   
  2. Where title_id = BI2184   
  3. Select * from sales  
  4. Where title_id = BI2184 

  

  因为在表中title_id中存在重复值,SQL Server使用关于title_id的直方图(参考Listing34.2)来估计匹配的行数  。对于BI2184值,它将查看EQ_ROWS值,值为343.0  。这表示在表中title_id值为BI2184的记录共有343行  。

  当一个查询参数(search argument)的精确匹配(exact match 即等号计算)在直方图中step没有发现时,SQL Server使用比查找值(search value)大的下一个step中的AVG_RANG_ROWS值  。例如,SQL Server对查找值为‘BI2187’进行评估,它将会发现匹配值为270.0行  。

  对一个范围检索,SQL Server把检范围两端的RANG_ROW和EQ_ROWS相加  。例如,利用Listing34.2中的直方图,如果查找参数为 where title_id <= BI2574,行数估计将是:

  314 + 613 + 343 + 270 + 277,或者为1817  。

  

  当直方图不能使用时,SQL Server索引密度来估计匹配行数  。对于等值查找的计算公式是直截了当的,例如:

  Sql代码

  

  1. Declare @tid varchar(6)   
  2. Select @tid = BI2574   
  3. Select count(*) from sales where title_id = @tid   
  4. Declare @tid varchar(6)  
  5. Select @tid = BI2574 
  6. Select count(*) from sales where title_id = @tid  

  行估计值等于指定键值的SQL Server索引密度(1.8621974E-3)乘以表中行数:

  

  Sql代码

  1. Select count(*) * 1.8621974E-3   
  2. From sales   
  3. Go   
  4. Select count(*) * 1.8621974E-3  
  5. From sales  
  6. Go  
  7. 314.19925631500001   

  

  如果一个查询的SARG为title_id 和stor_id,并且假如title_id的SARG是一个可在优化期间可评价的常量表达式,SQL Server会用title_id stor_id的索引密度和title_id的直方图来估计匹配的行数(对某些值来说,索引密度估计的值可能会大学直方图估计出来的值)  。SQL Server 将会用二者中较小的值作为匹配的行数  。

  根据title_id stor_id的索引密度,你能看到:

  

  Sql代码

  1. Select coun(*) * 5.997505E-6   
  2. From sales   
  3. Select coun(*) * 5.997505E-6  
  4. From sales  
  5. 1.011929031125   

  在这个例子中,SQL Server将用title_id 和stor_id的SQL Server索引密度来估计匹配的值  。在此情况下,它估计查询将返回一条匹配的行  。