网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 数据库类-> MySQL-> 优化SQL的另类思考

优化SQL的另类思考
作者:佚名 来源:InterNet 加入时间:2008-5-16
相关文章 相关书籍:
今天给大家介绍一个SQL优化案例,这是statpack中逻辑读排名第一的SQL.当前创建的索引建在(username,ends,approve_status,promoted_status)上。

以下是引用片段:
  BufferGetsExecutionsGetsperExec%TotalTime(s)Time(s)HashValue
  ------------------------------------------------------------------------
  116,608,373164,083710.740.67027.0711922.303701069644
  Module:java@test.cm2(TNSV1-V3)
  selectcount(*)fromtest
  whereusername=:1--这是一个高势列,
  andends>sysdate
  andapprove_statusin(0,1,-9)
  andid<>:2--这是主键
  andpromoted_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去思考问题,希望这个优化案例能对大家有所启示。


[文章录入员:nancy]

相关文章 相关书籍:
本站推荐内容

近期主机类热搜关键词:
美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

MySQL
ACCESS
MS SQL
MySQL
Oracle
Foxpro
PowerBuilder
Sybase
其它
电脑教程阅读排行
·如何安装并测试MySQL
·用MySQL创建数据库和数据库表
·MySQL数据导入导出方法与工具...
·图形化管理MySQL更轻松(二)
·图形化管理MySQL更轻松(一)
·MySQL安装与使用
·学习MySQL常用操作命令
·MySQL数据导入导出方法与工具...
·MySQL数据导入导出方法与工具...
·如何恢复MYSQL的ROOT口令