日度归档:2019年5月3日

mssql sqlserver or关键字和in关键字性能对比


摘要:
下文通过举例的方式讲述sql脚本中,or关键字和in关键字的性能对比,如下所示:
实验环境:sql server 2008 R2


下文通过举例的方式,对比讲述or关键字和in关键字的应用。
例:
数据表中有 2000万条数据:
查询方式1:分别使用 or 和 in 关键字获取前8条数据
查询方式2:分别使用 or 和 in 关键字获取前100条数据
查询方式3:分别使用 or 和 in 关键字获取前300条数据
查询方式4:分别使用 or 和 in 关键字获取前1200条数据


测试1,where 条件列为主键的情况,使用or 和 in 关键字的执行时间
查询方式1:or和in的执行时间: or的执行时间为:0.003s in的执行时间为:0.003s
查询方式2:or和in的执行时间: or的执行时间为:0.008s in的执行时间为:0.008s
查询方式3:or和in的执行时间: or的执行时间为:0.010s in的执行时间为:0.009s
查询方式4:or和in的执行时间: or的执行时间为:0.020s in的执行时间为:0.018s

测试2,where列为一般索引的情况,4组测试执行计划一样,执行的时间也基本没有区别。
查询方式1:or和in的执行时间: or的执行时间为:0.004s in的执行时间为:0.004s
查询方式2:or和in的执行时间: or的执行时间为:0.008s in的执行时间为:0.007s
查询方式3:or和in的执行时间: or的执行时间为:0.010s in的执行时间为:0.010s
查询方式4:or和in的执行时间: or的执行时间为:0.022s in的执行时间为:0.021s

测试3,where列没有索引的情况,4组测试执行计划就不一样,执行的时间也有了很大的区别。
查询方式1:or和in的执行时间: or的执行时间为:5.018s in的执行时间为:5.073s
查询方式2:or和in的执行时间: or的执行时间为:1min 04s in的执行时间为:5.020s
查询方式3:or和in的执行时间: or的执行时间为:1min 52s in的执行时间为:5.012s
查询方式4:or和in的执行时间: or的执行时间为:6min 15s in的执行时间为:5.050s


in和or的效率,取决where条件列是否有索引或者是否为主键,
当where检索列上存在索引或主键时,无很大性能差异,
如果没有索引时,in的性能比or性能强。

mssql sqlserver in关键字转换为=关键字的用法


摘要:
下文讲述将sql脚本中in关键字转换为=号的用法分享,如下所示:
实验环境:sql server 2008 R2


例:

 select info  from maomao365 where info in('sqlblog','sql教程','猫猫小屋');
 ----转换为
 select info  from maomao365 where info ='sqlblog' or info = 'sql教程' or info ='猫猫小屋' 

mssql sqlserver sql脚本中使用in关键字和join关键字的区别


摘要:
下文讲述sql脚本中使用in和join关键字的用法区别,如下所示:
实验环境:sql server 2008 R2


下文将使用举例的方式讲述in和join关键字的用法
1.创建数据表:
CREATE TABLE maomao365A
(
keyId INT ,
qty INT NOT NULL
)

插入数据:
insert into maomao365A values
(1,90),(2,93),(3,99)

—通过in关键字查询数据
select * from maomao365A where keyId in (1,1,1,1)

但是查询出来的数据,只有一条!
keyId qty
— —
1 90

—测试2,新建临时表,并插入重复数据四个1

— 创建临时表
CREATE TABLE #tmp
(
keyId INT
)

— 插入四个1的记录
insert into #tmp values (1),(1),(1),(1)

–使用join查询
select a.* from maomao365A a, #tmp b where a.keyId = b.keyId

—展示数据,有四条
keyId qty
— —
1 90
1 90
1 90
1 90

–如果我们使用in关键字访问,则只会显示一条数据
select t.* from maomao365A a where a.keyId in( select b.keyId from #tmp b )

—展示一条符合条件的数据
keyId qty
— —
1 90


从以上的实验,我们看出in关键字操作中,只展示出源表的数据
使用join关键字进行两表关联,则会进行笛卡尔积计算,可能会出现重复数据