gpt4 book ai didi

sql - 索引扫描、索引查找和表扫描

转载 作者:行者123 更新时间:2023-12-03 02:43:18 24 4
gpt4 key购买 nike

我有下表:

Create table Tab_with_Ix
(
id int not null,
name nvarchar(10),
phone decimal(10,0)
)

我插入了一些记录:

insert into Tab_with_Ix 
values(1, 'Yogesh', 8855664452), (2, 'Vinay', 9977884455), (3, 'Sam', 9988554466)

现在,我在 Tab_with_Ix 上创建一个非聚集索引:

CREATE NONCLUSTERED INDEX NCI_Ix on Tab_with_Ix(id)

现在,当我查询 Tab_with_Ix 时:

Select * 
from Tab_with_Ix
where id = 1

我得到的执行计划为:

enter image description here

但是,当我使用以下查询时:

Select id 
from Tab_with_Ix
where id = 1

我得到的执行计划为:

enter image description here

我的问题是:为什么 SQL Server 一次使用表扫描,另一次使用索引查找?

最佳答案

如果您执行SELECT * - 你想要所有列 - 所以最后,SQL Server必须返回到基表数据。在这种情况下,通常只执行表扫描(或聚集索引扫描)比使用昂贵的键查找(或 RID 查找,如果不存在聚集索引)进行索引查找更便宜。

如果您有很多行,那么在某些时候,SQL Server 执行索引扫描和单个(或几个)键/RID 查找会变得更加高效 - 因此,如果您的数据库中有数千行,示例表 - 在某个时刻(“临界点”),SQL Server 将开始使用您的非聚集索引。

在第二种情况下,当您执行 SELECT id 时,您只需要 id列 - 并且该列位于索引页中 - 因此对该索引进行索引查找将为 SQL Server 提供满足此查询所需的一切 - 因此,索引查找通常要快得多,并且比表扫描更受青睐。

这是您应尽量避免使用 SELECT * FROM dbo.Table众多原因之一。尽你所能地。与 SELECT *通常,不使用非聚集索引,而是使用表(或聚集索引)扫描。

关于sql - 索引扫描、索引查找和表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25443315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com