聚集索引的直方图偏斜

Gar*_*tes 2 sql-server statistics cardinality-estimates

问题

我一直在尝试优化从实体框架生成的查询,并注意到执行计划显示的估计非常不准确。经过一番挖掘,我注意到一些聚集索引的统计对象非常倾斜。以下是查询的顶级运算符的片段,按实际行排序:

查询中实际行与估计行的片段
(来源:imgh.us

编辑编辑了数据库名称。

从顶部开始的第三个运算符(我选择的那个)是聚集索引查找,当我查看该特定索引的统计对象时,我看到了荒谬的偏斜量:

严重倾斜的聚集索引统计信息
(来源:imgh.us

是否有一个原因?我很困惑为什么 SQL Server 仅通过完整扫描为该直方图生成 3 个步骤。表中有 225,000 多行,我希望看到更多的步骤和更小的范围,但我实际看到的是几乎每一行都包含在一个步骤中。重建索引和更新统计信息不会重新分配它。

除了该特定索引之外,许多其他聚集索引统计似乎也存在类似问题,并提供类似的错误估计。上面列表中的另一个算子是对 WorkOrder 表的聚簇索引扫描,它也产生了一个比较糟糕的估计。虽然看起来这是选择 30% 行的基数估计器,但它可能是参数嗅探(或统计数据以外的其他东西)的问题。

基本上,我的问题如下:

  • 聚集索引统计应该是什么样的?
  • 上面的分布是预期的吗?
  • 如果是预期的,我该如何解决这些错误的估计?
  • 如果不是预期的,我该如何纠正这些糟糕的统计数据?

EDIT2:这是 XML 计划:https : //www.brentozar.com/pastetheplan/?id=rJTjT4zze

Mar*_*ith 5

你的统计没问题。

它告诉你你有

  • 正好是值为 1 的一行
  • 1 行,值为 213152
  • 1 行,值为 213151
  • 213,144 个 > 1 和 < 213,151 的不同值(因此基本上每行对应 213,149 个可能的整数值,其中 5 个缺失)

  • @GarrettBates - 该搜索的估计执行次数为“407.694”,实际为“168796”,因此一开始就相差 400 倍。168796 搜索产生 157760 行。所以平均每次搜索 0.93 行。SQL Server 显然想象的搜索中有一个残余谓词,它比实际情况更具选择性 https://i.stack.imgur.com/wXbsb.png (2认同)