Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 索引扫描、索引查找和表扫描_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 索引扫描、索引查找和表扫描

Sql 索引扫描、索引查找和表扫描,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有以下表格: 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) 现在,我在选项卡上用_Ix创建一个非聚集索引: CR

我有以下表格:

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)
现在,我在
选项卡上用_Ix
创建一个非聚集索引:

CREATE NONCLUSTERED INDEX NCI_Ix on Tab_with_Ix(id)
Select * 
from Tab_with_Ix
where id = 1
现在,当我用Ix查询
选项卡时:

CREATE NONCLUSTERED INDEX NCI_Ix on Tab_with_Ix(id)
Select * 
from Tab_with_Ix
where id = 1
我得到的执行计划如下:

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

Select id 
from Tab_with_Ix 
where id = 1
我得到的执行计划如下:


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

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

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

在第二种情况下,当您执行
选择id
时,您只需要
id
列—该列位于索引页中—因此,该索引上的索引搜索将为SQL Server提供满足此查询所需的一切—因此,索引搜索通常要快得多,并且比表扫描更可取


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

这样做是因为行很少。如果你有数千个,你会得到一个不同的模式-很可能是索引和搜索keylookup@AllanS.Hansen:吹毛求疵:由于没有聚集索引,这将是一个RID查找(不是键查找),这是否意味着如果我增加表中的记录,第一个查询将使用index seek?@vstandsforvinay:如果您的查询获取的现有行的百分比非常小(通常小于1%),那么是的,SQL Server通常会以小于1%的相同百分比开始使用index seek+RID查找。。可以