SQL语句优化

1、count(*) <---> count(列)
没有索引的情况下,两者一样快;
有索引的情况下,如果这一列允许为 null,则count(列)快,若不允许为空,则一样快!
这是由于count(*)与count(列)不等价,count(*)所有列只要有一列不为null,就会被统计出来,count(列)只要这一列为null,就不会被统计出来!
所以,count(列)所谓的快是没有把数据统计完整!!!

count(列)每一通是否相同?
NO! 列的偏移量决定性能,列越靠后,访问的开销越大!而count(*)的算法与列无关,所以count(*)最快,count(最后一列)最慢!

2、FROM后跟的表的顺序
ORACLE FROM 后的表执行顺序是从后往前,所以就有规定:数据量少的表放在后面,数据量大的表放在前面。
这个规定不是没有道理,但是这个仅限于已经过时(SELECT /*+rule*/ ...)这种方式,现在放前放后性能都一样!

3、IN EXIST
ORACLE 10g ---> IN用的是filter算法,exist用的是anti算法,anti的反连接算法比filter算法更高效,但要指定非空后,IN用的也是anti算法,这样两者效率就会相同!
ORACLE 11g ---> IN EXIST用的算法都是anti的反连接算法,所以效率一样!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值