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语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
随机推荐
- JAVA 几种引用类型学习
1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从J ...
- python模块介绍- SocketServer 网络服务框架
来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServe ...
- SQL查询语句执行的顺序是-----------------
MSSQL逻辑查询的步骤 摘自:Microsoft SQL Server 2005技术内幕:T-SQL查询: 逻辑查询处理中的各个阶段 本节介绍逻辑查询处理所涉及的各个阶段.我先简要描述一下每个阶段, ...
- HDU2045
http://acm.hdu.edu.cn/showproblem.php?pid=2045 如果n-1的颜色和1相同,那么n有两种走法,如果n-1 的颜色和1不同,那么n只有1种选择方法 公式就是f ...
- 【Tree 1】树形结构数据呈现的递归算法实现
一.基本概况 在我的项目中,常常会用到树形结构的数据,最为明显的就是左边菜单栏,类似于window folder一样的东西. 而我之前一直是借助前端封装好的ZTree等工具实现展示,而后台则通常使用递 ...
- mongodb转换List实体(去掉多余的字段) 批量添加
Gson gson = new Gson(); String str = "list集合json字符串"; JsonObject object = gson.fromJson(st ...
- AX 4.0 调用打印设定的功能
PrintJobSettings printJobSettings; PrintJobSettings printJobSettings2; Boolean ok; container packPri ...
- CGI、FastCGI和PHP-FPM浅析
这段时间对Nginx+PHP-FPM的概念和机制一直不太清晰,趁着同事的分享和看过的几篇博文和资料,重新将思路处理一下. 首先,PHP-FPM(FastCGI Process Manager: Fas ...
- JAVA的包装类 【转】
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...
- Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import ja ...