vst*_*nay 4 sql sql-server sql-server-2008
我有以下表格:
Create table Tab_with_Ix
(
id int not null,
name nvarchar(10),
phone decimal(10,0)
)
Run Code Online (Sandbox Code Playgroud)
我插入了一些记录:
insert into Tab_with_Ix
values(1, 'Yogesh', 8855664452), (2, 'Vinay', 9977884455), (3, 'Sam', 9988554466)
Run Code Online (Sandbox Code Playgroud)
现在,我在上面创建一个非聚集索引Tab_with_Ix:
CREATE NONCLUSTERED INDEX NCI_Ix on Tab_with_Ix(id)
Run Code Online (Sandbox Code Playgroud)
现在,当我查询Tab_with_Ix:
Select *
from Tab_with_Ix
where id = 1
Run Code Online (Sandbox Code Playgroud)
我得到一个执行计划:

但是,当我使用以下查询时:
Select id
from Tab_with_Ix
where id = 1
Run Code Online (Sandbox Code Playgroud)
我得到一个执行计划:

我的问题是:为什么SQL Server一次使用表扫描,另一次,索引搜索?
如果你这样做SELECT *- 你想要所有列 - 所以最后,SQL Server必须返回到基表数据.在这种情况下,通常使用昂贵的密钥查找(或RID查找,如果不存在聚簇索引)进行表扫描(或聚簇索引扫描)而不是索引查找更便宜.
如果你有很多行,那么在某些时候SQL Server可以更有效地进行索引扫描和单个(或几个)键/ RID查找 - 所以如果你的样本表中有数千行 - 在某些时候("临界点"),SQL Server将开始使用您的非聚集索引.
在第二种情况下,当你这样做时SELECT id,你只需要id列 - 并且该列位于索引页面中 - 因此对该索引的索引查找将为SQL Server提供满足此查询所需的所有内容 - 因此,索引搜索是通常要快得多,并且优于表扫描.
这是您应该尽量避免使用的众多原因之一SELECT * FROM dbo.Table.使用a SELECT *,通常不使用非聚簇索引,而是使用表(或聚簇索引)扫描.
| 归档时间: |
|
| 查看次数: |
791 次 |
| 最近记录: |