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. Windows下查看进程及结束进程命令[转]

    Windows下查看进程及结束进程命令 1)查看占用8080端口的进程号 >netstat –aon | findstr “8080” 结果:TCP    0.0.0.0:8080        ...

  2. view坐标_ _ Android应用坐标系统全面详解

    转:http://blog.csdn.net/yanbober/article/details/50419117 1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自 ...

  3. MyEclipse转换Eclipse项目无法启动问题(转)

    将myeclipse中开发的动态web项目直接引入到eclipse中继续开发,启动tomcat时会发出警告,更重的问题是你想启动的项目不知哪里去了,没有读取到配置文件:       警告: [SetP ...

  4. ubuntu Server 14 自动更新

    https://help.ubuntu.com/stable/serverguide/automatic-updates.html http://spin.atomicobject.com/2014/ ...

  5. CGContextAddArcToPoint和CGContextAddArc

    比较难的是CGContextAddArcToPoint 代码如下: CGContextRef context=UIGraphicsGetCurrentContext(); CGContextSetRG ...

  6. bash操作小结

    刚开始学写bash脚本,发现有很多需要注意的细节问题,在这里记录一下便于记忆: 1. help test  帮助 2. bash提供的数组数据结构,它是以数字为下标的,和C语言从0开始的下一样  参考 ...

  7. HtmlAgilityPack下载开启压缩的页面乱码

    当一个被采集的网页是开启压缩了的话,如果使用HtmlAgilityPack 的HtmlWeb默认配置去下载,下载回来的HTML代码是乱码,应该进行如下操作 HtmlWeb web = new Html ...

  8. AngularJS 教程

    AngularJS 教程 AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 可以构建一个单一页面应用程序(SPAs:Single Page Applications). ...

  9. android自定义圆形图片和遇到的问题

    画圆遇到的问题:图片单位不一样,导致图片只能显示出圆的一部分:看代码: public class MyCircleIamge extends ImageView { private Context c ...

  10. shopnc 二次开发 每日签到积分领取

    /* 开始shopnc!!!!! url:xxx.com/index.php?act=index&op=userjf 一个四线城市的半吊子程序员~ 实现:前台模板文件 随便加入<a> ...