Sql 当where子句中的值发生变化时,索引查找对索引扫描的更改

Sql 当where子句中的值发生变化时,索引查找对索引扫描的更改,sql,sql-server,Sql,Sql Server,我有一个表ORDER有64列,OrderNo是主键。它还有两列ParentOrderNo和Type。对于单独订单,Type和ParentOrderNo将为空,对于分组订单,Type将填充“PRNT”或“CHLD”。OrderNo,其中Type='PRNT',将填充到组中所有订单(PRNT和CHLD)的ParentOrderNo列中。一个组可以有一个父订单和两个或多个子订单。该表为ParentOrderNo和Type列提供了非聚集索引(IX_ORDER_1) 此表中共有31654行。在我的测试用例

我有一个表
ORDER
有64列,
OrderNo
是主键。它还有两列
ParentOrderNo
Type
。对于单独订单,Type和
ParentOrderNo
将为空,对于分组订单,
Type
将填充“PRNT”或“CHLD”。OrderNo
,其中Type='PRNT'
,将填充到组中所有订单(PRNT和CHLD)的
ParentOrderNo
列中。一个组可以有一个父订单和两个或多个子订单。该表为
ParentOrderNo
Type
列提供了非聚集索引(IX_ORDER_1)

此表中共有31654行。在我的测试用例中,有30001个订单(1个家长和30000个孩子)

执行查询时:

Select top 1 *
  From   ORDER                  
  where PARENTORDERNO = '11278'  and Type ='prnt'
Select top 1 *
  From   ORDER                  
  where PARENTORDERNO = '11278'  and Type ='chld'
执行计划显示索引搜索使用(IX_顺序_1)

但当我执行查询时:

Select top 1 *
  From   ORDER                  
  where PARENTORDERNO = '11278'  and Type ='prnt'
Select top 1 *
  From   ORDER                  
  where PARENTORDERNO = '11278'  and Type ='chld'
执行计划显示使用聚集索引的索引扫描

有人能告诉我是什么导致了执行计划的变化吗。
提前感谢

根据数据库维护的有关索引的统计信息,优化器(正确地)估计,当
type='parent'
时,与条件匹配的记录很少,因此搜索更有效。对于
type='child'
,它估计有足够的记录,因此扫描将更有效,因为它将返回表中的大部分内容,而不是仅返回一条记录


在执行计划中,查看两次不同运行的
估计行
(和
实际行
,以了解估计的准确性。

很遗憾,我无法添加注释,因此我这样回答:

当您从表中选择超过15%的行(百分比因源而异,但通常为10%到15%)时,执行计划很可能使用索引扫描而不是索引搜索

对你来说,如果我理解正确,你有

“在我的测试用例中,有30001个订单(1个家长和30000个孩子)。”


只有一个父行是索引搜索的最佳候选行,30000个子行是查询优化器的最佳候选行。

什么时候扫描比搜索更有效?你的答案很有用。我点击了“这个答案很有用”按钮。但我收到了这样一条信息:“感谢您的反馈!记录了声誉低于15的人的投票,但不要更改公开显示的帖子分数”。谢谢你的帮助。我现在的名声是6岁(