优化SQL的另类思考
来源:互联网 发布:php开源图片管理系统 编辑:程序博客网 时间:2024/05/21 09:51
今天给大家介绍一个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
------------- ------------ -------------- ------ -------- --------- ----------
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
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
where username = :1 and ends>sysdate and approve_status in (0,1,-9) and and promoted_status = 1
第三步,将两个结果相减即可实现业务
我们在做SQL优化时,如何把一条SQL根据需要等价转化成多条,需要考虑当前的应用逻辑,以及当前数据库中索引的情况,优化便会事半功倍。如何跳出ORACLE去思考问题,希望这个优化案例能对大家有所启示。
--EOF--
- 优化SQL的另类思考
- oracle:关于优化SQL的另类思考
- 移动互联机会的另类思考
- sql的另类插入方法
- SQL注入的另类技巧
- 优化一句T-SQL语句引发的思考
- 优化一句T-SQL语句引发的思考
- mysql sql优化的一些思考和结论
- 李轶楠:性能优化的另类考虑
- 乔布斯的10个与众不同:践行另类思考
- 屏幕布局动态划分的另类思考----抽象屏幕类
- [另类思考] 简单的问题复杂着解决
- 直面"另类服务"方式,思考你的创业模式
- 优化问题的思考
- 程序优化的思考
- Sql Server数据库备份的另类解决方案
- EXCEL数据导入SQL 的另类用法
- 好听到耳朵会怀孕的GROUP BY另类优化
- Subversion的一些资料
- 唯一性索引和非唯一性索引深入
- 对于测试架构师的简单理解
- 用Perl的hash数组实现个性化监控
- 快速复制一张大表讨论
- 优化SQL的另类思考
- 重用大表空闲字段所带来的数据处理问题
- 利用googlecode创建在线subversion版本库
- 分页sql中普通写法和rowid写法的性能比较
- 不让自己显示在彩虹QQ的隐身列表中
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- 为什么人总是那么现实?有些东西真不会做,可真没有人愿意帮忙。发了也无人问津呢?
- 老紫竹JAVA提高教程(5)-认识Set集合之EnumSet
- Adobe Flex resources