`
chengnuoangel
  • 浏览: 70174 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论

Oracle语句优化规则汇总(4)

 
阅读更多

1. 使用表的别名(Alias)

  当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

  (Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属)

  2. EXISTS替代IN

  在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下, 使用EXISTS(NOT EXISTS)通常将提高查询的效率。

  低效:

  SELECT *
  FROM EMP (基础表)
  WHERE EMPNO > 0
  AND DEPTNO IN (SELECT DEPTNO
  FROM DEPT
  WHERE LOC = ‘MELB’)

  高效:

  SELECT *
  FROM EMP (基础表)
  WHERE EMPNO > 0
  AND EXISTS (SELECT ‘X’
  FROM DEPT
  WHERE DEPT.DEPTNO = EMP.DEPTNO
  AND LOC = ‘MELB’)

  (相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率,下面将指出)

  3. NOT EXISTS替代NOT IN

  在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历) 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)NOT EXISTS.

  例如:

  SELECT …
  FROM EMP
  WHERE DEPT_NO NOT IN (SELECT DEPT_NO
  FROM DEPT
  WHERE DEPT_CAT=’A’);

  为了提高效率。改写为:

 (方法一: 高效)

  SELECT ….
  FROM EMP A,DEPT B
  WHERE A.DEPT_NO = B.DEPT(+)
  AND B.DEPT_NO IS NULL
  AND B.DEPT_CAT(+) = ‘A’

  (方法二: 最高效)

  SELECT ….
  FROM EMP E
  WHERE NOT EXISTS (SELECT ‘X’
  FROM DEPT D
  WHERE D.DEPT_NO = E.DEPT_NO
  AND DEPT_CAT = ‘A’);

  4. 用表连接替换EXISTS

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

  SELECT ENAME
  FROM EMP E
  WHERE EXISTS (SELECT ‘X’
  FROM DEPT
  WHERE DEPT_NO = E.DEPT_NO
  AND DEPT_CAT = ‘A’);

  (更高效)

  SELECT ENAME
  FROM DEPT D,EMP E
  WHERE E.DEPT_NO = D.DEPT_NO
  AND DEPT_CAT = ‘A’ ;

  (RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP)

  5. EXISTS替换DISTINCT

  当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换

  例如:

  低效:

  SELECT DISTINCT DEPT_NO,DEPT_NAME
  FROM DEPT D,EMP E
  WHERE D.DEPT_NO = E.DEPT_NO

高效:

  SELECT DEPT_NO,DEPT_NAME
  FROM DEPT D
  WHERE EXISTS ( SELECT ‘X’
  FROM EMP E
  WHERE E.DEPT_NO = D.DEPT_NO);

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

6. 识别低效执行SQL语句

  用下列SQL工具找出低效SQL

  SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
  ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
  ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
  SQL_TEXT
  FROM V$SQLAREA
  WHERE EXECUTIONS>0
  AND BUFFER_GETS > 0
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
  ORDER BY 4 DESC;

  (虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)

7. 使用TKPROF 工具来查询SQL性能状态

  SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中。 这个跟踪文件提供了许多有用的信息,例如解析次数。执行次数,CPU使用时间等。这些数据将可以用来优化你的系统。

  设置SQL TRACE在会话级别:

  有效  

ALTER SESSION SET SQL_TRACE TRUE

  设置SQL TRACE 在整个数据库有效仿, 你必须将SQL_TRACE参数在init.ora中设为TRUE USER_DUMP_DEST参数说明了生成跟踪文件的目录

  (这里并没有提到TKPROF的用法, SQL TRACE的用法也不够准确, 设置SQL TRACE首先要在init.ora中设定TIMED_STATISTICS 这样才能得到那些重要的时间状态。 生成的trace文件是不可读的,所以要用TKPROF工具对其进行转换,

分享到:
评论

相关推荐

    Oracle语句优化规则汇总.pdf

    这篇文档“Oracle语句优化规则汇总.pdf”很可能提供了关于如何提高Oracle数据库查询效率、减少资源消耗的关键信息。以下是一些可能涵盖在文档中的关键知识点: 1. **索引优化**: - 使用合适的索引类型,如B树索引...

    Oracle语句优化规则汇总

    Oracle数据库是全球广泛使用的...通过遵循这些Oracle语句优化规则,你可以显著提高数据库的性能,减少资源消耗,同时提高应用程序的响应速度。持续学习和实践,结合具体的业务场景,你会发现更多优化的策略和技巧。

    oracle语句优化规则汇总

    本篇文章将深入探讨Oracle语句优化的若干关键规则,帮助你提升数据库的运行效率,减少资源消耗,提高应用的响应速度。 一、选择正确的索引策略 1. **选择合适的索引类型**:B树索引适用于常规查询,位图索引适合于...

    Oracle sql语句优化规则汇总

    ### Oracle SQL语句优化规则详解 #### 一、选择正确的优化器 在Oracle数据库中,SQL语句的执行效率很大程度上取决于所选的优化器。Oracle提供了三种优化器模式: 1. **基于规则的优化器(RULE)**:这是Oracle...

    oracle语句优化.docx

    "Oracle 语句优化" 本文将详细地介绍 Oracle 语句优化的方法和技巧,涵盖多表关联、EXISTS 和 IN 语句的使用、INDEX_JOIN 优化、WHERE 和 HAVING 语句的区别、NOT IN 和 &lt;&gt; 操作符的使用、LIKE 操作符的替代、UNION...

    Oracle语句优化规则详解【技术文档】

    本文将深入探讨Oracle语句优化的规则和技术,旨在帮助开发者和DBA提升查询效率,降低资源消耗,实现数据库性能的最大化。 一、理解执行计划 Oracle在处理SQL语句时会生成一个执行计划,它定义了数据的检索方式。...

    oracle优化规则总汇

    以下是一些关键的Oracle优化规则: 1. **选用适合的优化器**:Oracle提供了三种优化器:RULE(基于规则)、COST(基于成本)和CHOOSE(选择性)。COST优化器是最常用的一种,它基于对象的统计信息来决定最佳执行...

    oracle查询语句优化

    Oracle查询语句优化是数据库管理中至关重要的环节,能够显著提升系统性能,减少资源消耗。本文将围绕Oracle查询优化的29个小技巧进行深入探讨。 首先,选择合适的Oracle优化器至关重要。Oracle提供了三种优化器:...

    ORACLE配置文件优化

    6. **Oracle语句优化**:阅读"Oracle语句优化规则汇总.pdf"和"ORACLE-优化.txt"文件,可以学习到如何编写高效的SQL语句,如避免全表扫描,利用索引,减少子查询,以及使用适当的连接方式等。此外,了解并使用Oracle...

    oracle常用SQL语句(汇总版).zip

    本文件"oracle常用SQL语句(汇总版)"将对Oracle中的常用SQL语法进行详尽阐述。 1. 数据查询: - `SELECT`语句:这是SQL中最基本的查询语句,用于从表中检索数据。例如,`SELECT * FROM 表名;`将返回表中的所有记录...

    《oracle SQL性能优化》中文电子书

    3. **SQL语句优化**:包括编写高效的SQL语句,避免全表扫描,合理使用JOIN操作,减少子查询,以及使用绑定变量等技巧。理解SQL执行计划,学会使用`EXPLAIN PLAN`来分析和改进查询性能。 4. **表和分区设计**:表的...

Global site tag (gtag.js) - Google Analytics