网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > 性能调优 > 关于优化SQL的另类思考-性能调优  

关于优化SQL的另类思考-性能调优

2008-05-08  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

今天给大家介绍一个SQL优化案例,这是statpack中逻辑读排名第一的SQL.当前创建的索引建在(username,ends,approve_status,promoted_status)上。

以下是引用片段:
  Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value
  ------------- ------------ -------------- ------ -------- --------- ----------
  116,608,373 164,083 710.7 40.6 7027.07 11922.30 3701069644
  Module: java@test.cm2 (TNS V1-V3)
  select count(*) from test
  where username = :1 --这是一个高势列,

网管网www_bitscn_com


  and ends>sysdate
  and approve_status in (0,1,-9)
  and id <> :2 --这是主键
  and promoted_status = 1
网管网www.bitscn.com

  如果大家见到这样的SQL语句会怎么样优化?通常的做法,是在当前索引中冗余id字段,以避免回表。但这样要去调整这张大表的索引. 中国网管论坛bbs.bitsCN.com

  在看到上面的SQL后,询问开发能否明确的知道id=:2并且满足其它条件的这样的记录是否一定存在。开发经过查证后,最后的答复是无法肯定.既然在应用层无法确定,那也要想个办法来解决大量回表的问题。在经过仔细观察后,我将上面这条SQL语句转换成下面两条SQL以及最后一步应用逻辑来实现: 网管u家u.bitscn@com

  第一条SQL:

网管联盟bitsCN_com

  Select/*+ index(a, PK_test_ID) */ count(*) from test a 网管u家u.bitsCN.com

  where id=:1 and ends>sysdate and approve_status in (0,1,-9) and promoted_status = 1 and username=:2

网管联盟bitsCN@com

  第二条SQL: 网管联盟bitsCN_com

  select count(*) from test

网管下载dl.bitscn.com

  where username = :1 and ends>sysdate and approve_status in (0,1,-9) and and promoted_status = 1

网管论坛bbs_bitsCN_com

  第三步,将两个结果相减即可实现业务 网管联盟bitsCN@com

  我们在做SQL优化时,如何把一条SQL根据需要等价转化成多条,需要考虑当前的应用逻辑,以及当前数据库中索引的情况,优化便会事半功倍。如何跳出ORACLE去思考问题,希望这个优化案例能对大家有所启示。 网管bitscn_com


TAGs
 上一篇:深入学习Oracle分区表及分区索引-性能调优   下一篇:Oracle数据库9i在AIX环境下的性能调整-性能调优
关于优化SQL的另类思考-性能调优 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: