我假装挺狠
2010-03-18 11:48
浏览 775

sql中字符串比较和in的效率

如果table_a中
date_id char(8)
那么下面两种哪个效率高些?
select * from table_a where date_id in ('200909','200908','200907,'200906');
select * from table_a where date_id <= '200909' and date_id >= '200906';

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • suziwen 2010-03-18 12:38
    已采纳

    根据情况而定,不同的数据库如MYSQL,MSSQL,ORACLE等执行情况不同,
    就连同一个数据库不同版本执行情况也有可能不同,
    像ORACLE 9跟ORACLE 10 ,你对同一个比较复杂的SQL执行EXPLAIN分析执行时间时,结果也会差别很大的。
    而且同一个SQL,如果一个加上了对应的索引,那执行时间也会差很多。

    一般在解析SQL时,数据库也会根据SQL自己去 优化一下,比如ORACLE的HIT策略等。
    对于你提供的SQL语句,如果仅仅是这样的话,觉得两条效果差不多,应该可以当成一样仅用,

    如果是动态拼接的,比如将来可能要把IN里面的数越来越多,可能效率就会慢下很多,
    但对于<=和>=,可能就必須保证你要查里面的数据没有需要排除的。(我知道的IN对于ORACLE里有最多1000个项的限制,超过就会报错),
    所以感觉要优化SQL语句,还得自己先了解所使用的数据库,再学习下对应的优化方法

    打赏 评论
  • iteye_13500 2010-03-18 11:57

    楼主还是在自己机器上测试一下:

    我在mysql上测试:

    如果date_id 设置成主键, 两条语句效率一样

    如果没有设置主键,select * from table_a where date_id <= '200909' and date_id >= '200906';的效率要高。

    打赏 评论
  • iteye_13500 2010-03-18 11:58

    mysql 上用explain语句可以检测该语句查询出结果检索到的行数。

    打赏 评论
  • iteye_566 2010-03-18 12:14

    在oracle数据库中,第二个效率会高一些,因为在比较时,都是拿date_id 去比较的,但是第二个会拿date_id 与两个临界值相比,而第一条,会逐个的进行比较,这样的话,至少检索字段的数量上减少了,你可以测试一下

    打赏 评论
  • wanghaolovezlq 2010-03-18 12:41

    下面这个sql性能要高些

    参考
    SQL 语句性能调优

    http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1002limh/

    打赏 评论
  • hao117 2010-03-18 12:54

    and效率比较高,
    假如数据库有N条数据的话,
    第一种就要比较4N次,
    而第二条,如果执行date_id >= '200906'查询结果是M条的话,则
    date_id <= '200909' 比较的次数就是M的,总次数为N+M。
    sql语句条件执行的顺序是从右向左

    打赏 评论
  • hao117 2010-03-18 12:56

    N+M<=2N

    打赏 评论

相关推荐 更多相似问题