`
weigang.gao
  • 浏览: 488083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

高效率优化Oracle SQL

 
阅读更多

好多同学对sql的优化好像是知道的甚少,最近总结了几条仅供参考,不过除少数可能要依情况而定,大多数还是相当有效的。

[标注:以下说的(低效)与(高效)都是相当来说的。]

1、Where子句中的连接顺序:

ORACLE采用自下而上的顺序解析WHERE子句。

根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

举例:

(低效)

select … from table1 t1 where t1.sal > 300 and t1.jobtype = ’0001′ and 20 < (select count(*) from table1 t2 where t2.pno = t1.tno;

(高效)

select … from table1 t1 where 20 < (select count(*) from table1 t2 where t2.pno = t1.tno and t1.sal > 300 and t1.jobtype = ’0001′;

2、Select子句中避免使用 “ * ”:

当你想在select子句中列出所有的column时,使用动态SQL列引用 ‘*’ 是一个方便的方法。

不幸的是,这是一个非常低效的方法。

实际上,ORACLE在解析的过程中,会将 ‘*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

 

3、减少访问数据库的次数:

当执行每条SQL语句时,ORACLE在内部执行了许多工作:

解析SQL语句、估算索引的利用率、绑定变量、读数据块等等。

由此可见,减少访问数据库的次数,就能实际上减少ORACLE的工作量。

举例:

题目——我要查找编号为0001、0002学生的信息。

(低效)

select name,age,gender,address from t_student where id = ’0001′;

select name,age,gender,address from t_student where id = ’0002′;

(高效)

select a.name,a.age,a.gender,a.address,b.name,b.age,b.gender,b.address from t_student a,t_student b where a.id = ’0001′ and b.id = ’0002′;

 

4、使用Decode函数来减少处理时间:

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

举例:

(低效)

select count(*), sum(banace) from table1 where dept_id = ’0001′ and name like ‘anger%’;

select count(*), sum(banace) from table1 where dept_id = ’0002′ and name like ‘anger%’;

(高效)

select  count(decode(dept_id,’0001′,’XYZ’,null)) count_01,count(decode(dept_id,’0002′,’XYZ’,null)) count_02,

sum(decode(dept_id,’0001′,dept_id,null)) sum_01,sum(decode(dept_id,’0002′,dept_id,null)) sum_02

from table1

where name like ‘anger%’;

 

5、整合简单,无关联的数据库访问:

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

举例:

(低效)

select name from table1 where id = ’0001′;

select name from table2 where id = ’0001′;

select name from table3 where id = ’0001′;

(高效)

select t1.name, t2.name, t3.name

from table1 t1, table2 t2, table3 t3

where t1.id(+) = ’0001′ and t2.id(+) = ’0001′ and t3.id(+) = ’0001′

【注:上面例子虽然高效,但是可读性差,需要量情而定啊!】

 

6、删除重复记录:

最高效的删除重复记录方法 ( 因为使用了ROWID)

举例:

delete from table1 t1

where t1.rowid > (select min(t2.rowid) from table1 t2 where t1.id = t2.id);

7、尽量不要使用having子句,可以考虑用where替换。

having只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作。

如果能通过where子句限制记录的数目,那就能减少这方面的开销。

 

8、尽量用表的别名:

当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。

这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

9、用exists替代in(发现好多程序员不知道这个怎么用):

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。

在这种情况下,使用exists(或not exists)通常将提高查询的效率。

   

举例:

(低效)

select … from table1 t1 where t1.id > 10 and pno in (select no from table2 where name like ‘www%’);

(高效)

select … from table1 t1 where t1.id > 10 and exists (select 1 from table2 t2 where t1.pno = t2.no and name like ‘www%’);

10、用not exists替代not in:

在子查询中,not in子句将执行一个内部的排序和合并。

无论在哪种情况下,not in都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。

为了避免使用not in,我们可以把它改写成外连接(Outer Joins)或not exists。

 

11、用exists替换distinct:

当提交一个包含一对多表信息的查询时,避免在select子句中使用distinct. 一般可以考虑用exists替换

举例:

(低效)

select distinct d.dept_no, d.dept_name from t_dept d, t_emp e where d.dept_no = e.dept_no;

(高效)

select d.dept_no, d.dept_name from t_dept d where exists (select 1 from t_emp where d.dept_no = e.dept_no);

exists使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.

12、用表连接替换exists:

通常来说,采用表连接的方式比exists更有效率。

  

举例:

(低效)

select ename from emp e where exists (select 1 from dept where dept_no = e.dept_no and dept_cat = ‘W’);

SELECT ENAME

(高效)

select ename from dept d, emp e where e.dept_no = d.dept_no and dept_cat = ‘W’;

13、避免在索引列上使用is null和is not null

避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。

对于单列索引,如果列包含空值,索引中将不存在此记录;

对于复合索引,如果每个列都为空,索引中同样不存在此记录;

 

如果至少有一个列不为空,则记录存在于索引中。

举例:

如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null),

ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入),

然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空。

因此你可以插入1000 条具有相同键值的记录,当然它们都是空!

 

因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引。

14、最好把复杂的sql,去看下它的执行计划,这样有利于你分析知道自己的sql效率如何。

上面的资料也是本人长期看资料积攒下来的,并且很多都已经在项目中,特别是大数据量时得到了体现。

 

参考:http://blog.csdn.net/yanshaobo0410/article/details/8446570

Oracle之sql语句优化:http://www.linuxidc.com/Linux/2014-08/106005.htm

分享到:
评论

相关推荐

    SQL优化 SQL优化软件 SQL优化工具

    SQL优化是数据库管理中的关键环节,它涉及到提升查询性能、减少资源消耗以及改善系统整体效率。SQL优化软件和工具能够帮助数据库管理员(DBA)和开发人员找出性能瓶颈,优化查询逻辑,从而提高数据库系统的响应速度...

    Oracle 高性能SQL优化

    Oracle数据库的高性能SQL优化是数据库管理员和开发人员关注的关键领域,因为它直接影响到系统的响应时间和整体性能。Oracle性能管理是一个持续的过程,包括主动和被动两个方面。主动性能管理强调在系统设计和开发...

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    深入揭示OracleSQL优化与调优的原理、核心技术与思想方法 盖国强鼎力推荐! Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是SQL性能问题。本书是作者十年磨一剑的成果之一...

    ORACLE+SQL效率优化.rar

    本资料“ORACLE+SQL效率优化.rar”深入探讨了如何优化Oracle中的SQL语句,以提高数据库性能,确保系统运行流畅。 首先,了解SQL执行效率的基础在于理解查询执行计划。Oracle使用解析器解析SQL语句,然后生成执行...

    oracle sql优化

    本文将深入探讨Oracle SQL优化的相关知识点,帮助你掌握提高数据库效率的核心技巧。 一、了解执行计划 执行计划是Oracle解析SQL语句后确定的数据获取策略,包括表的扫描方式(全表扫描或索引扫描)、连接顺序、排序...

    Oracle SQL优化文档

    Oracle SQL优化文档提供了对Oracle数据库进行SQL语句优化的一系列方法和工具,旨在帮助数据库管理员和开发人员提高SQL查询性能和数据库效率。文档内容涵盖了从基本的SQL优化思路到具体的分析工具,详细介绍了如何...

    Oracle SQL 官方文档

    11g第二版(11G2)是Oracle的一个重要版本,提供了许多增强功能和优化。本官方文档集包括四份重要的参考资料,涵盖了Oracle SQL的核心概念、语法和最佳实践。 1. **PL/SQL语言参考**:PL/SQL是Oracle特有的过程化...

    ORACLE-SQL性能优化大全.pdf

    - **常见问题**:SQL语句执行效率低、资源占用过高、响应时间过长等。 - **原因分析**:开发人员往往只关注查询结果的正确性而忽视效率,或者不了解SQL语句执行原理和影响执行效率的因素。 - **调整的方法**: -...

    Oracle Sql 性能优化

    Oracle Sql性能优化 解宝喆 1、选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在...

    《基于Oracle的SQL优化》PDF版本下载.txt

    根据提供的文件信息,本文将对《基于Oracle的SQL优化》这一主题进行深入解析,包括但不限于SQL优化的重要性、Oracle数据库的特点以及具体的SQL优化方法等。 ### SQL优化的重要性 SQL(Structured Query Language)...

    Oracle SQL 优化与调优技术详解-附录:SQL提示

    在Oracle数据库中,SQL优化是一个至关重要的环节,它能够显著提高数据库查询的效率和性能。本文将详细介绍Oracle SQL中的“提示”(HINT)技术,这是Oracle SQL优化中使用的一项辅助手段,通过为查询提供额外的优化...

    关于Oracle多表连接,提高效率,性能优化操作

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. 这是因为ORACLE只对...

    oracle sql 高级编程

    学习如何创建、管理和调整索引,以及理解执行计划和SQL优化器的工作原理,对于提升数据库性能至关重要。 七、事务与并发控制 Oracle支持ACID属性的事务,包括原子性、一致性、隔离性和持久性。此外,行级锁定和多...

    oracle SQL语法大全

    Oracle SQL优化包括查询优化、索引优化、存储优化、资源管理等,通过EXPLAIN PLAN和SQL Profiler等工具分析和改进SQL性能。 总结,"Oracle SQL语法大全"涵盖了Oracle SQL的各个方面,无论你是初学者还是有经验的...

    ORACLE_SQLDeveloper使用教程

    - SQL Developer 提供了工具帮助优化 SQL 语句,提高执行效率。 3. **SQL 脚本管理:** - 可以将常用的 SQL 语句保存为脚本文件,便于重复使用。 - SQL Developer 支持脚本文件的管理,包括创建、编辑和执行。 ...

    Oracle SQL编写规范

    Oracle SQL编写规范是指在编写SQL语句时的一些基本原则和方法,旨在提高SQL语句的执行效率和可读性。以下是Oracle SQL编写规范的详细解释: 1. 尽量用索引,特别在从大量数据中返回小部分数据时 使用索引可以大大...

    Oracle_SQL优化规则

    Oracle SQL优化是数据库管理员和开发人员提升数据库性能的关键技能。SQL(结构化查询语言)是访问和操作Oracle数据库的主要工具,而优化SQL语句则能显著提高查询速度,减少资源消耗,进而提升整个系统的响应时间。...

    ORACLE中SQL查询优化技术

    ### ORACLE中SQL查询优化技术 #### 一、引言 在现代企业级数据库应用中,Oracle数据库因其高性能、高可靠性和丰富的功能被广泛采用。然而,在实际的应用场景下,即使是设计良好的数据库系统也可能因为查询效率低下...

Global site tag (gtag.js) - Google Analytics