sql - 为什么在索引过滤时进行表扫描?
问题描述
问题:为什么执行计划在对索引进行过滤时显示表扫描?
数据库引擎: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 会导致搜索。
解决方案
推荐阅读
- ruby-on-rails - Rails:使用 2 个模型设计,注销都注销
- d3.js - 通过父节点和子节点d3js的位置附加圆圈
- python - 在绘制 Pandas 之前过滤数据
- python - 计算数组中连续相等的值
- python - 在 numpy 中生成一个均匀分布的随机数的 NxM 数组(不是 [0,1))
- twitter-bootstrap - 将底部与 Bootstrap 对齐
- reactjs - 如何在中心设置 reactstrap modal-header 的内容?
- java - 为什么即使 myLocation 是全局变量,当 onSuccess() 终止时 myLocation 也会变为 null?
- redis - 相同变量的 Redis 复制
- javascript - 在渲染所有 DOM 元素后,控制器或路由器中是否存在要调用的钩子?