博客统计信息

51cto博客之星
用户名:Larry.Yue
文章数:213
评论数:372
访问量:279865
无忧币:3919
博客积分:5037
博客等级:8
注册日期:2007-10-23

我的技术圈(1)

更多>>
INDEX建立方式对SQL的影响
2009-06-23 23:00:27
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://miracle.blog.51cto.com/255044/169244
        我常常会听到一些同事对自己的SQL很有信心,往往说一句:“你看,已经走索引了”。但是我们真的使用了适合我们的索引吗?
        我抓取到一句SQL,消耗了太多的IO。
      
      
select SMIN_INFOID,NVL(MI.MONU_PROVINCE,'未知'),COUNT(*) I_RESULTNUM
FROM TBL_WAPXXX WARE,TBL_SMSXXX SMIN,TBL_MOBILEXXX MI,TBL_USERXXX USIN
WHERE WARE_DATE > :B2 AND WARE_DATE <= :B2 + :B1 /24
            AND WARE.WARE_UID_FK=USIN.USIN_UID_FK AND SUBSTR(USIN.USIN_PHNUM,1,7)=MI.MONU_PHONENUM(+)
            AND WARE_WRUIID_FK=SMIN.SMIN_INFOID GROUP BY SMIN_INFOID ,MI.MONU_PROVINCE

     因为TBL_WAPXXX数据量比较大,而造成该SQL执行缓慢并且IO消耗高。看看它的SQL执行计划和成本估算(如下图)



        注意画框INDEX(为TBL_WAPXXX的相关索引),虽然走了索引,但是成本和cardnility都很高。检查这个索引发现其实BLEVEL只有2。而再仔细查看SQL并询问实现的功能,其实索引的字段为DATE类型,该SQL只是检查最近几个小时的信息变化.
        在WHERE条件中(WARE_DATE > :B2)因为是范围查询,索引使用了(rang scan),加之该表数据量众多(千万级别),直接影响了SQL执行性能。
         但是通过检查发现,这个索引就是直接创建的B-TREE索引。而我注意到其实该SQL检查的就是最近一个或几个小时的数据,终于可以找到一些问题所在了。INDEX建立时默认情况下,索引的字段采用升序(asc)建立,而这种方法显然是不适合当前这个SQL的,我们可以通过建立基于降序的索引来适应实际的需求。
        
SQL> create index IDX_WARE_DATE1 on TBL_WAPXXXX(WARE_DATE desc)
    2        tablespace USERTBS;
   
        再来检查执行的SQL计划和预算成本:



        执行成本大幅降低。INDEX的建立时索引字段排序的方式其实对特定SQL影响还是很大的。尤其是一些历史流水表,在某些情况下只是查询近期的数据时,就显得尤为重要了。
        注:文中的SQL因为某些问题,我做了适当的处理,在显示的执行计划图中也是处理过的,所以会出现表名不十分匹配的问题,请大家见谅。
        PS:
         最近总是很忙,忙的只有在睡觉前才有时间写点东西。但是实在太累,总是无法好好的写。真的要好好坚持坚持呀 -:),否则年初的目标就很难完成了。

本文出自 “Be the miracle!” 博客,请务必保留此出处http://miracle.blog.51cto.com/255044/169244

我爱CPU
1人
了这篇文章
类别:ORACLE足迹技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
2009-07-15 11:57:33
年初啥目标啊?呵呵。

2009-10-09 16:01:30
如果是B树的话不论是升序还是降序要搜索某个数据在B树上走的层数不应该是基本一样的吗?为什么说升序降序会有影响呢?

2011-07-28 14:08:30
岳老师,您好
这几天我在研究索引的问题,现有一个问题不清楚特来请教:
就是GUID和自动增长列,哪一个更适合做主键或索引?这两天看的我真头昏,还望岳老师指点一二!

 

发表评论            

2011-2012跨年度有奖征文:项目回忆录
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: