and、or和in


在开始测试前先创建测试数据:

create table student
(
id int primary key not null ,
sid   int
)

create procedure insertDate ()
BEGIN
  DECLARE
v_id int ;
  set
v_id = 0 ;
  while
v_id < 100000
  DO
   insert into
student values ( v_id , v_id );
   set
v_id = v_id + 1 ;
  end while
;
END
call
insertDate ()

 

在这里,我首先创建了一个表,其中 id 为主键。注意 DB2 中默认将主键列创建为索引,所以在这个表中 id 列有索引, sid 列没有索引。之后插入了 10 万行的数据。下面测试 orand 一边有索引时一边没索引时的情况

select * from student where sid = 5 or id = 10

 

select * from student where sid = 5 and id = 10

       

 

 

可以看到当 or 的一边有索引一边没有索引时,没有利用索引,而 and 的一边有索引一边没有索引时 , 却利用了索引。

 

下面测试 or and 的两边都有索引的情况

select * from student where sid = 5 or id = 10

     

 

select * from student where sid = 5 and id = 10

 

         

下面测试 orin 的在有索引下的情况

select * from student where sid = 5 or sid = 10

 

     

 

select * from student where sid   in ( 5 , 10 )

 

可以看到在有索引的情况下, in or 的速度差不多。

下面测试没有索引的情况下, in or 的速度:

首先删除索引 drop index stu_sid

运行下面语句 :

select * from student where sid = 5 and id = 10

select * from student where sid   in ( 5 , 10 )

两个语句的执行计划都如下 :

 

    所以, in or 在没有索引的情况下速度也是一样的。

 

 

总结 :

         经过在 DB2 上的测试,如果 or 的左右两边的列都有索引,则可以利用索引,否则(只有一边的列有索引或者两边都没有索引)不能利用索引。而 and 两种情况都可以利用索引。

       有人说因为 or 不能利用索引所以要将 or 换成 in, 其实是错的。如果 or 的两边是不同列,则不能换成 in, 如果是同样的列,可以转换成 in 的写法。但是这列如果有索引 in 或者 or 都会利用索引,而且速度一样。这列没有索引的话, inor 都不能利用索引,速度也是一样的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值