非原创

1. 选用合适的ORACLE优化器

ORACLE的优化器有3种: a. RULE(基于规则)b. COST(基于成本) c. CHOOSE(选择性)

选择缺省的优化器,可以通过对init.ora中OPTIMIZER_MODE参数的各种声明,如RULE, COST, CHOOSE, ALL_ROWS, FIRST_ROWS。

你当然也可以在sql句级或是会话级别对其进行覆盖。

为了使用基于成本的优化器(CBO,Cost-Based Optimizer),你必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性。

如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关.

如果table已经被analyze过,优化器模式将自动成为CBO, 反之数据库将采用RULE。

在缺省情况,Oracle将采用CHOOSE优化器,为了避免那些不必要的全表扫描,你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

2. 访问table的方式

ORACLE采用两种访问表中记录的方式:

a. 全表扫描

全表扫描就是顺序地访问表中每条记录.ORACLE采用一次读入多个数据块的方式优化全表扫描。

b. 通过ROWID访问表

你可以采用基于ROWID的访问方式,提高访问表的效率,ROWID包含了表中记录的物理位置信息。

ORACLE采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快

速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。

3. 选择最有效的表名顺序(只在基于规则优化器中有效)

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理

当ORACLE处理多个表,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后那个)并对记录进行排序,然后扫描

第二个表,最后将所有从第二个表中检索出的记录与第一个表中合适的记录进行合并。

所以在FROM子句包含多个表的情况下,必须选择记录条数最少的表作为基础表。

4. WHERE子句中的连接顺序

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉

最大数量记录的条件必须写在WHERE子句的末尾。

低效:select ... from emp e where sal>50000 and job='manager' and 25<(select count(*) from emp where mgr=e.empno);

高效:select ... from emp e where 25<(select count(*) from emp where mgr=e.empno) and sal>50000 and job='manager';

5. SELECT子句中避免使用 ' * '

ORACLE在解析时会将 ' * '依次转换成所有的列名,这个工作是查询数据字典完成,很耗时。

6. 减少访问数据库的次数

当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL,估算索引利用率,绑定变量,读数据块等。由此可见,

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

低效:SELECT EMP_NAME, SALARY, GRAND FROM EMP WHERE EMP_NO=342;

SELECT EMP_NAME, SALARY, GRAND FROM EMP WHERE EMP_NO=291;

高效:SELECT A.EMP_NAME, A.SALARY, A.GRADE, B.EMP_NAME, B.SALARY, B.GRADE

FROM EMP A, EMP B WHERE A.EMP_NO=342 AND B.EMP_NO=291;

7. 使用DECODE函数减少处理时间

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

低效:SELECT COUNT(*), SUM(SAL) FROM EMP WHERE DEPT_NO=0020 AND ENAME LIKE 'SMITH%';

SELECT COUNT(*), SUM(SAL) FROM EMP WHERE DEPT_NO=0030 AND ENAME LIKE 'SMITH%';

高效:SELECT COUNT(DECODE(DEPT_NO, 0020,'X', NULL)) D0020_COUNT,

COUNT(DECODE(DEPT_NO, 0030,'X', NULL)) D0030_COUNT,

SUM(DECODE(DEPT_NO, 0020,SAL,NULL)) D0020_SAL,

SUM(DECODE(DEPT_NO, 0030,  SAL,  NULL)) D0030_SAL

FROM EMP WHERE ENAME LIKE 'SMITH%';

类似的,DECODE函数也可以运用于GROUP BY和ORDER BY子句中。

8. 整合简单无关联的数据库访问。

原始:SELECT NAME FROM EMP WHERE EMP_NO=1234;

SELECT NAME FROM  DPT WHERE DPT_NO=10;

SELECT NAME FROM CAT WHERE CAT_TYPE=‘RD’;

整合:SELECT E.NAME, D.NAME, C.NAME

FROM CAT C, DPT D, EMP E, DUAL X

WHERE NVL('X', X.DUMMY) = NVL('X', E.ROWID(+))

AND NVL('X', X.DUMMY) = NVL('X', D.ROWID(+))

AND NVL('X', X.DUMMY) = NVL('X', C.ROWID(+))

AND E.EMP_NO(+) = 1234

AND D.DEPT_NO(+) = 10

AND C.CAT_TYPE(+) = 'RD'

9. 删除重复记录

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

DELETE FROM EMP E

WHERE E.ROWID >

(SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);

oracle优化(一)的更多相关文章

  1. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  2. Oracle优化总结

    本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案.关键词 ORACLE数据库 环境调整 ...

  3. Oracle优化的几个简单步骤

    数据库优化的讨论可以说是一个永恒的主题.资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据库配置等等.还有的人认为要抓出执行最慢的语句来进行优化.但实际情况 ...

  4. oracle优化原则(二)

    SQL优化原则 二.SQL语句编写注意问题 www.2cto.com 下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍.在这些where子句中,即使某些列存在索引,但是由于编写了劣质 ...

  5. SDE+ORACLE优化配置

    原文 SDE+ORACLE优化配置 SDE的性能取决于: 首先操作系统的性能:其次是Oracle的性能,再次是SDE的性能. 第一:操作系统,无非是内存.CPU.带宽等. 可以有待提高的地方:第一.硬 ...

  6. Oracle优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  7. ORACLE 优化

    本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了 ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境 ...

  8. oracle优化思考-双刃剑

    oracle优化是一个双刃剑,特别注意这把剑用的场合:系统规划OLTP or OLAP 优化1:索引 在DML操作时.必须维护索引.假设大量的DML操作,想想看,IO是不是老高了? 索引长处:在非常多 ...

  9. oracle 优化or 更换in、exists、union all几个字眼,测试没有问题!

    oracle 优化or 更换in.exists.union几个字眼.测试没有问题! 根据实际情况选择相应的语句是.假设指数,or全表扫描,in 和not in 应慎用.否则会导致全表扫描.  sele ...

  10. oracle 优化方法总结

    分析和优化的基本步骤如下: 1.如果是SQL语句的写法问题,我们可以通过在不更改业务逻辑的情况下改写SQL来加以解决: 2.如果是不必要的全表扫描/排序而导致了目标SQL的性能问题,我们可以通过建立合 ...

随机推荐

  1. 2018-2019-2 20165312《网络攻防技术》Exp4 恶意代码分析

    2018-2019-2 20165312<网络攻防技术>Exp4 恶意代码分析 知识点总结 1.有关schtasks schtacks的作用:安排命令和程序定期运行或在指定时间内运行.从计 ...

  2. Oracle数据库自带表空间的详细说明

    1.SYSAUX表空间 SYSAUX表空间在Oracle Database 10g中引入,作为SYSTEM表空间的辅助表空间.以前一些使用独立表空间或系统表空间的数据库组件现在在SYSAUX表空间中创 ...

  3. OO第三次博客

    规格化设计的发展历史 在计算机的早期发展中,软件开发没有可以遵循的系统方法,往往只有源代码而没有软件说明书等文档,因此这段时期的软件通用性时很有限的.后来到了20世纪60年代,软件开始被广泛使用,软件 ...

  4. 欢迎来到GitHub世界

    什么是GitHub GitHub(Pronunciation:/githʌb/)  这是一个为开发者提供Git仓库的托管服务,这是一个让开发者们共享代码的完美场所.GitHub公司总部位于美国旧金山, ...

  5. windows server 2003产生的 Minidmp蓝屏文件分析求助

    在机房运行的四台服务器中均出现了蓝屏dmp文件,经过整理发现CDMS主备服务器最近(2018年1月开始)蓝屏的dmp很多.经过自己的学习分析发现不足以找到先关的原因和处理方法,希望得到大牛们的帮助.以 ...

  6. Python数据类型的内置函数之tuple(元组),dict(字典),set(集合)

    Python数据类型内置函数 - str(字符串) - list(列表) - tuple(元组) - dict(字典) - set(收集) tuple(元组)的操作 - (count)统计元组中元素出 ...

  7. 闪动效果的实现 (jquery方式和css方式)以及 keyframes和opacity 与ie等各浏览器兼容问题

    opacity 是CSS3中:设置元素的不透明度的属性(支持ie8以上) opacity: value|inherit;value用于规定不透明度.从 0.0 (完全透明)到 1.0(完全不透明). ...

  8. JAVA体系学习-导向

    一:当前学习内容 数值类型处理总结,字符类型处理总结,日期类型处理总结 spring 事务源码分析 spring源码系列 二:当前学习 主攻:并发编程->RPC原理->MQ原理->- ...

  9. vue 单独页面body css 样式设置

    给某个page下template中的第一个div设置如下样式: .body-bg { position: absolute; width: 100%; height: 100%; top:; left ...

  10. python 获取中文拼音首字母;判断文件夹是否存在

    1.如何获取中文字符串的首字母 import pinyin #输入name def get_pinyin_first_alpha(name): return "".join([i[ ...