SQL Server查询数据三种方式Table Scan/Index Seek/Index Scan小结

当向SQL Server查询数据时,有三种数据查询方式可供选择:Table Scan、Index Seek和Index Scan,下边我们说说它们的概念,使用场合, 以及优先级,所有测试使用数据库版本SQL Server 2008。

1.概念

Table Scan:全表扫描,没有用到索引;
Index Seek:索引查找,有用到索引,根据聚集索引和非聚集索引分为Clustered Index Seek和NonClustered Index Seek;
Index Scan:索引扫描,有用到索引,效率比Table Scan高,但低于Index Seek。也分为Clustered Index Scan和NonClustered Index Scan;

2.使用场合

2.1 Table Scan

一般只有当表没有创建索引时才会用到Index Scan,否则SQL Server只使用Index Seek和Index Scan。下边我们创建一个表test(不创建索引):

create table test
(
    a int,
    b int,
    c int,
    d int
)

执行查询并查看执行计划:

select * from test



2.2 Index Seek

接下来我们为表test创建一个聚集索引和一个非聚集索引,并添加1W条数据:

create clustered index pk_a on test(a)
create index ix_b_c on test(b,c)
--1W
declare @i int
set @i=1
while(@i<=10000) begin
    insert into test(a,b,c,d) select @i,@i,@i,@i
    set @i=@i+1
end

执行查询并查看执行计划:

select * from test where a=1
select * from test where b=1 and c=1



说明:当数据量比较少时,所有查询可能都用Clustered Index Seek。

2.3 Index Scan

执行查询并查看执行计划:

select * from test where d=1
select * from test where c=1



三、什么时候会用到Index Seek?

显然,Index Seek查询效率最高,我们应该在查询中尽量用Index Seek,那什么时候会用到Index Seek呢?我们再看两个查询的执行计划:

select * from test where a=1 and b=1 and c=1
select * from test where b=1 and c=1 and d=1



综合2.2和2.3的例子,当满足以下条件时会用到Index Seek:

·索引全部字段包含在where子句中;
·复合索引部分字段包含在where子句中且是索引前几个字段;


四、优先级

根据2.3和第3节的例子,不难得出优先级Table Scan/Index Seek/Index Scan顺序如下(从高到低):

引用内容 引用内容
Clustered Index Seek>NonClustered Index Seek>NonClustered Index Scan>Clustered Index Scan>Table Scan


评论: 0 | 引用: 0 | 查看次数: 5428
发表评论
登录后再发表评论!