mssql sqlserver between and、in 、or关键字的性能比较


摘要:
下文通过实例的方法分析 between and、in、or关键字的性能对比,如下所示:
实验环境:sqlserver 2008 R2


例:

  /*
   between and 语法类似 keyId >= and keyId <= 的语法
 */
 create table test
 (
   keyId int identity(1,1) primary key,
   info varchar(800)
 )
 
 ---生成基础数据1万条
 
declare @i int 
set @i =0 
while @i<50000
begin
  insert into test(info)values(@i)
  set @i=@i+1 
end
 
go  

SET STATISTICS PROFILE ON   
SET STATISTICS IO ON 
SET STATISTICS TIME ON 
print '-----and-----'
SELECT * FROM test where keyId >= 100 and keyId <= 104;
print '-----between and-----'
SELECT * FROM test where keyId between 100 and 104 
print '-----in-----'
SELECT * FROM test where keyId in (100, 101, 102, 103, 104);
print '-----or-----'
SELECT * FROM test where keyId = 100 or keyId = 101 
or keyId = 102 or keyId = 103 or keyId = 104;

 
go
---truncate table test
---drop     table test 


    输出信息:
	SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 2 毫秒,占用时间 = 2 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
-----and-----

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(5 行受影响)
表 'test'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(2 行受影响)

(1 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 41 毫秒。
-----between and-----

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(5 行受影响)
表 'test'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(2 行受影响)

(1 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 6 毫秒。
-----in-----

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(5 行受影响)
表 'test'。扫描计数 5,逻辑读取 10 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(2 行受影响)

(1 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 2 毫秒。
-----or-----

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(5 行受影响)
表 'test'。扫描计数 5,逻辑读取 10 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(2 行受影响)

(1 行受影响)

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

 SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。


注意事项:
从查询计划上,我们可以看出 写法1:and 和between and 具有相同的效率和相同的功能
以上四种写法(and、between and、in、or)在查询计划上都是用了索引查找功能
唯一的区别在于:
and、between and在逻辑读(I/O操作)上面少于 in 和or 关键字
即得到结论如下:
and、between and 在执行效率上优于(in、or)关键字