CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

优化SQL的另类思考

作者: 丹臣,  出处:blog, 责任编辑: 李书琴, 
2008-05-07 09:38
  今天给大家介绍一个SQL优化案例,这是statpack中逻辑读排名第一的SQL。

  今天给大家介绍一个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 --这是一个高势列,
  and ends>sysdate
  and approve_status in (0,1,-9)
  and id <> :2 --这是主键
  and promoted_status = 1

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

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

  第一条SQL:

  Select/*+ index(a, PK_test_ID) */ count(*) from test a

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

  第二条SQL:

  select count(*) from test

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

  第三步,将两个结果相减即可实现业务

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

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2007, ChinaByte
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i