在索引上筛选时为什么要扫描表?

hgqdbh6s  于 2021-07-26  发布在  Java
关注(0)|答案(0)|浏览(209)

问:为什么执行计划在索引上过滤时显示表扫描?
数据库引擎:sql server 2019
表行数:4000
我读过很多关于如何在查询中使用非聚集索引的文章,并在这里浏览了几篇文章,但是我在执行计划中看到的行为与理论不一致。
这是一个简单的表(我知道,一个堆应该有一个聚集索引,通常会有,这只是为了说明问题)

Create Table People (LastName NVarchar(50), FirstName NVarchar(50))

Create NONCLUSTERED INDEX Idx_LastName ON People (LastName)

表中填充了4000行数据,没有空值。
如果我执行以下查询:

SELECT LastName FROM People WHERE LastName = 'Smith'

我得到了我所期望的,那就是在idx\u lastname上的索引seek。
但是,如果我执行:

SELECT LastName, FirstName FROM People WHERE LastName = 'Smith'

执行计划显示表扫描。我推断这是一次“全表扫描”
当我仍然只对索引列进行筛选,并且只从非索引列中选择与筛选的数据子集特别匹配的值时(在本例中,lastnames与'smith'匹配),为什么要进行表扫描?
我知道查询引擎需要扫描与姓氏'smith'关联的完整的名字集,但是应该已经对名字池进行筛选,因为它只是与'smith'关联的所有名字,而'smith'只是表中名字总数的一小部分。
那么,为什么要全表扫描呢?
也许它不是一个完整的表扫描,而是一个部分表扫描?但是,如果是这样的话,我很难证明。另外,可能4000条记录不足以强制查询引擎执行索引查找,但我认为应该是这样,因为只要选择lastname就会导致查找。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题