oracle sql优化笔记
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优化笔记的更多相关文章
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- oracle sql 优化大全
转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...
- [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)
前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综 ...
- Oracle SQL优化器简介
目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...
- oracle sql优化
整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2 减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...
- Oracle SQL优化一(常见方法)
1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...
- Oracle SQL优化原则
原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...
- Oracle SQL 优化规则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
随机推荐
- BlockingQueue深入分析
1.BlockingQueue定义的常用方法如下 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e,time,unit) 移除 remove() p ...
- [DFNews] GetData也出取证软件了
从事计算机取证的应该都听说过MIP(Mount Image Pro).VFC仿真和Recover My Files,上述三个应用比较广泛的软件都是GetData公司的产品.GetData现在也推出了自 ...
- 数据结构&算法-单链表
1.引言 工作一年了,感觉越来越懒散,把很多基础性的东西都慢慢遗忘了,最近想趁着还没忘完,回顾一下,整理了点笔记,分享一下. 如有错的地方,欢迎大家怒喷. 2.学习 我们就从最简单的链表开始吧. 链表 ...
- Objective-C中的@property和@synthesize用法
@代表“Objective-C”的标志,证明您正在使用Objective-C语言 Objective-C语言关键词,@property与@synthesize配对使用. 功能:让编译好器自动编写一个与 ...
- 关于n!mod p
2016.1.26 让我们来研究一下关于n!在mod p下的性质,当然这里p是质数. 首先n!=a*pe,其中p不可整除a.我们现在来做两件事情,求e和a mod p. 显然,n/p表示[1,n]中p ...
- 使用Maven编译项目时提示程序包javax.servlet.http不存在
将apache-tomcat-8.0.23\lib下的servlet-api.jar拷贝到C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext下即可
- 货币单位类RmbUnit
import java.math.BigDecimal; public enum RmbUnit { FEN{ public String toFen(String amt) { BigDecimal ...
- Django views 中的 shortcut function
shortcut function都在django.shortcuts这个包中,主要包含有:render(), render_to_response(), redirect(), get_object ...
- 静态修饰符(关键字static)
1.Static修饰的方法或变量通常称为类方法和类属性 2.静态方法中不能使用this和super关键字,也不能做为局部变量使用 3.在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成 ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...