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岁(