首页 > 解决方案 > 为什么在索引过滤时进行表扫描?

问题描述

问题:为什么执行计划在对索引进行过滤时显示表扫描?

数据库引擎:SQL Server 2019

表行数:4,000

我已经阅读了很多关于如何在查询中使用非聚集索引的文章,并在这里挖掘了几篇文章,但是我在执行计划中看到的行为与理论不一致。

这是一个简单的表(一个堆,我知道,它应该有一个聚集索引,通常它会,这只是为了演示这个问题)

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

Create NONCLUSTERED INDEX Idx_LastName ON People (LastName)

该表填充了 4,000 行数据,没有空值。

如果我执行以下查询:

SELECT LastName FROM People WHERE LastName = 'Smith'

我得到了我所期望的,即 Idx_LastName 上的 Index Seek。

但是,如果我执行:

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

执行计划显示表扫描。我推断这是“全表扫描”。

当我仍然只过滤索引列并且只从非索引列中选择与过滤的数据子集特别匹配的值时,为什么我会得到表扫描 - 在这种情况下,姓氏匹配'smith'?

我知道查询引擎需要扫描与姓氏'Smith' 相关联的全部名字,但是应该已经过滤了这个名字池,因为它只是与'Smith' 相关联的所有名字——其中一小部分表中名字的总数。

那么,为什么要进行全表扫描呢?

也许它不是真正的全表扫描,而是部分表扫描?但是,如果是这样的话,我很难证明这一点。此外,可能 4,000 条记录不足以强制查询引擎进行索引搜索,但我认为应该是因为仅选择 LastName 会导致搜索。

标签: sqlsql-serverindexing

解决方案


推荐阅读