oracle优化一般分为:
1、sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的)
A、oracle的sql语句的条件是从右往左执行的,如下语句:select * from t_user where nation='回族' and age > 20.oracle首先是查询年龄大于20岁的,再查询民族为回族的,最后汇总两次得到的结果。
B、根据A中说的sql语句执行特点,上面的语句是可以进行优化的。A中的sql语句查询条件不同可能会有不同的情况,见下面分析:
I、查询条件为:nation='回族' and age > 20,先执行age>20,年龄大于20的数据很可能会很多;
II、查询条件为:age > 20 and nation='回族' , 先执行nation='回族' ,民族为回族的数据可能会比较少(相对年龄大于20的情况,毕竟回族是少数民族嘛);
III、假如I和II中的第一次查询用时差不多,那么第二次查询时,是在数据很多的时候查民族为回族的速度快了,还是在数据很少的时候查年龄大于20的快呢?这个可以根据实际情况尝试下。
C、如果age字段建立了索引(下面会说索引),那就将索引字段的查询条件放最右端,我曾尝试过,大量数据情况下,速度会提高很多,甚至可能都不敢相信的那种。
其实,每个表的每条记录都有一个rowid(还有rownum,这2个的区别后面会说),rowid可以类似的理解为对象的内存地址,有这个地址就能找到对应的信息。
2、存储过程(这可能也不叫优化吧,是自己实践中,临时想到的一个方法,算是一种思路吧)
如果一条sql语句非常复杂(多表关联,数据量庞大等情况),这种sql一般性能都非常的差,可以考虑将复杂的sql拆分成简单的sql语句。但是开发的过程中执行只能执行一条sql语句,怎么办?那就可以用存储过程来编写,存储过程返回需要的结果集即可。同时存储过程是在数据库里面,pl/sql developer工具可以很方便的进行测试调试获取的结果集是否正确,这样比起将sql放在后台来说,测试、维护方便得多。我有次写过一条多表关联的复杂sql语句,经过自己尝试,发现这个多表关联的语句中,有个表的单位字段加上索引就会让这条语句执行只花几秒,但是客户现场该字段不能建索引(原因这里不提了),导致这条sql执行起来要1分钟左右。后来我把这条sql语句写成存储过程,最后得到返回结果集所花时间为不到2秒。具体做法如下:
A、就拿下面语句作为示例:select a.username,a.age,b.name as sexname,c.name as addrname from t_user a join t_sex b on a.sexcode=b.code join t_addr c on a.addrcode=c.code where a.age>20 and a.sexcode='m' and a.addrcode='xiamen'; 实际情况的复杂语句比这个复杂多了,这里暂时先拿这个简单的语句来说明。
B、建立几张事务临时表,并把事务临时表(这些表也可以做其他模块计算数据等用途)上面的部分字段建立索引。针对A中的语句,建立2张临时表,一张表存性别信息(其中code字段建立索引),一张表存住址信息(其中code字段建立索引),最后张表是存返回的结果集。
C、首先将复杂sql语句中需要用到的各个表的数据插入对应临时表中,再查询得到最终结果。针对A中的语句,首先将t_sex表中性别为m的数据插入性别临时表中(这个语句很简单吧?),再将地址表中厦门的地址的记录插入地址临时表中,最后通过查询性别临时表、地址临时表和t_user表得到最终结果。这样得到结果集的速度可能快很多,因为t_sex和t_addr表没有索引,数据量大的情况,查询起来特别慢
上面的举例因为表比较简单,可能也不够恰当。但是我想说的是,复杂的sql,特别是关联查询时非常耗时的操作。所以首先可以想到将复杂的数据化成多条简单的语句,再使用oracle其他优化方法(比如上面示例中使用到了索引和事务临时表)进行优化,这样很可能会大幅提高sql性能。
3、索引
索引类似书的目录,我们一看目录,就知道想看的内容在哪页了。可以大概这么理解:索引存的是表每行记录所在的磁盘地址,通过索引查询,就很快知道了查询数据所在磁盘哪些地方,如果没有索引,那就只能在磁盘中一条条查找了,有索引减少了io次数,自然提高了查询数据。但是每次向表添加(删除、更新操作类似情况)数据后,就要将新增记录所在的地址添加到索引中,这样就会导致新增数据的时候速度变慢。大概这么解释吧,为了能看懂,不一定完全正确。知道了索引,我们就可以在表上面添加适当的索引来提高查询语句的性能。
可以将索引看成一张独特的表,sql查询时,如果字段是索引字段就会使用索引进行查询,此时就会先查索引这张独特的表,再去查询屋里表,所以不是将表的每个字段都变成索引字段就会提高查询效率,同时索引会影响插入数据的性能,所以建议索引需要看场合。
4、分区表
如果一个表的数据量太大,查询起来,肯定速度会慢,这时候可以考虑将普通表做成分区表,当然分库也是不错的办法,但是有时候分库对数据的操作很不方便,什么是分区表,网上资料很多,就不说了。

oracle sql优化笔记的更多相关文章

  1. Oracle SQL优化[转]

    Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...

  2. oracle sql 优化大全

    转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...

  3. [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)

    前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综 ...

  4. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  5. Oracle SQL 优化原则(实用篇)

    由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...

  6. oracle sql优化

    整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2    减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...

  7. Oracle SQL优化一(常见方法)

    1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...

  8. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

  9. Oracle SQL 优化规则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

随机推荐

  1. ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )

    把apress.pro.asp.net.mvc.4.framework里的CHAPTER 13翻译过来罢了. XD 首先说URL的构造. 其实这个也谈不上构造,只是语法特性吧. 命名参数规范+匿名对象 ...

  2. Android接收系统广播

    Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息.比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条 ...

  3. PHP 开发的 API 多版本管理实践

    遇到的情况 本文针对移动互联网客户端需要兼容旧版的情况,强制升级到最新版本的 app 不在讨论之列. 在 bugtags.com 项目中,我们的版本遵循下面规范.1.0.1大功能.小更新.bug 修正 ...

  4. Gocd持续部署利器

    http://www.go.cd/documentation/user/current http://www.go.cd/images/home-image1.png Gocd 是ThoughtWor ...

  5. 标准盒模型与IE盒模型之间的转换

    首先上图,这两张很明显可以看出IE盒模型和标准盒模型之间的差别. 当然今天不是去细细追究两种模型具体是怎么去计算布局的,那个很多文章已经已经有过了,不再重复.以前刚开始学习盒模型的时候,就学到的是IE ...

  6. 山东ACM省赛历届入口

    山东省第一届ACM大学生程序设计竞赛 山东省第二届ACM大学生程序设计竞赛 山东省第三届ACM大学生程序设计竞赛 山东省第四届ACM大学生程序设计竞赛 山东省第五届ACM大学生程序设计竞赛 山东省第六 ...

  7. 在脚本中刷新impala元信息

    刷新impala元信息 impala-shell -q 'invalidate metadata' -i hslave1 impala-shell -q 'select count(*) from p ...

  8. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

    今天碰到了一个查询异常问题,上网查了一下,感谢原创和译者 如果你使用的数据库连接类是 the Data Access Application Blocks "SqlHelper" ...

  9. js显示当前时间

    闲着没事在闪存里看到有人需要js显示当前时间,就一时兴起写了个. 输出格式:“2013年12月18日 星期三 上午9:05:00 ”. <script type="text/javas ...

  10. js事件委托,可以使新添加的元素具有事件(event运用)

    miaov视频教程  http://study.163.com/course/courseMain.htm?courseId=231002 <!DOCTYPE html PUBLIC " ...