- 浏览: 485565 次
- 性别:
- 来自: OnePiece
文章分类
- 全部博客 (196)
- --------- 基础----------- (0)
- java 碎碎念 (12)
- java 并行编程 (11)
- java I/O (6)
- java Charset & Encoding (2)
- spring学习笔记 (8)
- 正则表达式 (5)
- web前端-javascript (11)
- web前端-jQuery (7)
- web前端-碎碎念 (1)
- mybatis (0)
- 数据库-通用 (8)
- 数据库-oracle (20)
- nosql-redis (11)
- nosql-mongoDB (1)
- xml (2)
- log4j (2)
- uml (3)
- web services: soap/wsdl (6)
- soa-tuscany (2)
- linux (6)
- ----------修养----------- (0)
- 深入理解java虚拟机 (7)
- java 设计模式 (9)
- 数据结构和算法 (2)
- 读书笔记--代码整洁之道 (2)
- 计算机基础 (1)
- -----------践行---------- (0)
- 重构(refactor) (7)
- jvm-诊断 (4)
- 数据库-让oracle跑得更快 (7)
- Nginx (6)
- ehcache (2)
- 短信开发 (1)
- Servlet+Filter+Listener (2)
- 运维 (6)
- 问题记录 (38)
- 杂七杂八 (12)
最新评论
-
zhanggang807:
第二种方法比较好
<spring> 定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext() -
assasszt:
谢谢分享,很清楚的讲明了原理。
字符集与字符编码简介 -
su0nils000:
难得的笔记
<进阶-2> 打造高效正则表达式 -
足至迹留:
mini188 写道用MD5来解决碰撞是不是也是可行的呢?个人 ...
Hash简介 -
mini188:
用MD5来解决碰撞是不是也是可行的呢?
Hash简介
Oracle数据库中优化器(optimizer)是sql分析和执行的优化工具,它负责制定sql的执行计划,也就是它负责保证sql执行的效率最高,比如优化器决定oracle以什么样的方式访问数据,是全表扫描(Full Table Scan, FTS),索引范围扫描(Index Range Scan)还是全索引快速扫描(Index Fast Full Scan, INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如hash_join还是nested loops或是merge join。这些因素直接决定着sql的执行效率,所以优化器是sql执行的核心,它做出的执行计划好坏,直接决定着sql的执行效率。
Oracle的优化器有两种,基于规则的优化器(RBO)和基于代价的优化器(CBO),从oracle10g开始,RBO已经被弃用(但是我们依然可以通过HINT方式来使用它)。
4.1 RBO基于规则的优化器
在8i之前,oracle使用的是一种叫做RBO(Rule Based Optimizer,基于规则的优化器)的优化器,它的执行机制非常简单,就是在优化器里嵌入若干种规则,执行的sql语句符合哪种规则,就按照规则制定出相应的执行计划,比如说表上有个索引,如果谓词上有索引的列存在,则oracle会选择索引,否则选择全表扫描;又比如,两个表关联的时候,按照表在sql中的位置来决定哪个是驱动表,哪个是被驱动表。
下图是RBO在选择执行计划的一个优先级列表。
但事实是,走索引未必比走全表扫描快,还要看数据分布等。比如,首先创建一个分布极不均匀的表:
在RBO的年代里,这两条的执行计划时这样的:
执行计划
最后一句提示当前使用的优化器是RBO,建议使用CBO。
再次查询
执行计划:
使用hint /*+ rule*/的方式强制让oracle使用RBO优化器来产生执行计划,结果非常让人失望,oracle在id字段有索引的情况下,毫无悬念地全部选择了索引。
实际上我们知道,对于id=1,几乎所有的数据全都符合谓词条件,选择索引只能增加额外的开销(因为oracle要首先访问索引数据块,在索引上找到了相应的键值,然后按照键值上的rowid再去访问表中的相应数据),既然我们几乎要访问表中所有的数据,那么全表扫描自然是最优的选择,很遗憾的是,RBO让我们失望地做出了错误的选择。
RBO的情况就是这样,它是一种呆板、过时的优化器,已经在oracle10g以后的版本上被彻底剔除掉了(但仍然能通过使用hint来强制使用)。
4.2 CBO基于成本的优化器
从8i开始,oracle引入了CBO(Cost Based Optimizer, 基于成本的优化器),它的思路是让oracle获取所有执行计划相关的信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终执行计划。CBO是一种比RBO更理性的优化器。
还是拿上面的例子,看下CBO的表现:
执行计划:
执行计划:
CBO表现的非常完美,CBO会根据表的统计信息做出正确的执行计划:
Id=1, 全表扫描
Id=99, 索引扫描
因为这样的选择代价是最小的。从10g开始, oracle已经彻底丢弃了RBO。即使在表、索引没有被分析的时候,oracle依然会使用CBO。此时,oracle会使用一种叫做动态采样的技术,在分析sql的时候,动态的收集表、索引上的一些数据块,使用这些数据块的信息及字典表中关于这些对象的信息来计算出执行计划的代价,进而挑选出最优的执行计划。
比如:
可以看到,当表没有做分析的时候,oracle会使用动态采样来收集统计信息,这个动作只有在sql执行的第一次,即硬分析阶段使用,后续的软分析将不再使用动态采样,直接使用第一次sql硬分析时生成的执行计划。
CBO优化器有两种可选的运行模式:
(1) FIRST_ROWS(n)
(2) ALL_ROWS
当设置优化器模式为FIRST_ROWS(n)时,意味着oracle在执行sql时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。这种需求在一些网站搜索或者BBS的分页上经常看到,比如每次只查询信息的前20条或BBS的前20个帖子,这时设置FIRST_ROW(n)就非常合适,优化器并不需要同时将所有符合条件的结果返回。比如:
Select /*+ first_rows(10) */ b.x, b.y
from (select /*+ first_rows(10) */ a.*, rownum rnum
from (select /*+ first_rows(10)*/ * from t order by x) a where rownum <= 20) b
where rnum >= 10;
这是一个典型的分页的例子,每次从结果取出10条记录。需要注意的是,排序使用的字段x必须创建有索引,否则CBO会忽略FIRST_ROWS(N)而使用ALL_ROWS.
ALL_ROWS在OLAP系统中使用得比较多,它的目的在于用最快的速度获得sql执行的最后一条记录,而不是前n条数据。和FIRST_ROWS(n)正好相反,ALL_ROWS强调sql整体的执行效率,而FIRST_ROWS(n)强调以最快的速度返回前n行,而不管所有的结果返回时长,可能最后一条要很长时间之后才能获得。
Oracle的优化器有两种,基于规则的优化器(RBO)和基于代价的优化器(CBO),从oracle10g开始,RBO已经被弃用(但是我们依然可以通过HINT方式来使用它)。
4.1 RBO基于规则的优化器
在8i之前,oracle使用的是一种叫做RBO(Rule Based Optimizer,基于规则的优化器)的优化器,它的执行机制非常简单,就是在优化器里嵌入若干种规则,执行的sql语句符合哪种规则,就按照规则制定出相应的执行计划,比如说表上有个索引,如果谓词上有索引的列存在,则oracle会选择索引,否则选择全表扫描;又比如,两个表关联的时候,按照表在sql中的位置来决定哪个是驱动表,哪个是被驱动表。
下图是RBO在选择执行计划的一个优先级列表。
但事实是,走索引未必比走全表扫描快,还要看数据分布等。比如,首先创建一个分布极不均匀的表:
Create table t as select 1 id, object_name from dba_objects; Update t set id=99 where rownum = 1; ---这样整个表就只有第一行的id=99;其余都是1. Create index ind_t on t(id); Select id, count(*) from t group by id; 结果: ID COUNT(*) ---------------------------- 1 51080 99 1
在RBO的年代里,这两条的执行计划时这样的:
Select /*+ rule */ * from t where id=99;
执行计划
最后一句提示当前使用的优化器是RBO,建议使用CBO。
再次查询
Select /*+ rule*/ * from t where id=1;
执行计划:
使用hint /*+ rule*/的方式强制让oracle使用RBO优化器来产生执行计划,结果非常让人失望,oracle在id字段有索引的情况下,毫无悬念地全部选择了索引。
实际上我们知道,对于id=1,几乎所有的数据全都符合谓词条件,选择索引只能增加额外的开销(因为oracle要首先访问索引数据块,在索引上找到了相应的键值,然后按照键值上的rowid再去访问表中的相应数据),既然我们几乎要访问表中所有的数据,那么全表扫描自然是最优的选择,很遗憾的是,RBO让我们失望地做出了错误的选择。
RBO的情况就是这样,它是一种呆板、过时的优化器,已经在oracle10g以后的版本上被彻底剔除掉了(但仍然能通过使用hint来强制使用)。
4.2 CBO基于成本的优化器
从8i开始,oracle引入了CBO(Cost Based Optimizer, 基于成本的优化器),它的思路是让oracle获取所有执行计划相关的信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终执行计划。CBO是一种比RBO更理性的优化器。
还是拿上面的例子,看下CBO的表现:
Exec dbms_stats.gather_table_stats(user, ‘t’, cascade=>true); Select /*+ all_rows */ * from t where id=1;
执行计划:
Select /*+ all_rows */ * from t where id=99;
执行计划:
CBO表现的非常完美,CBO会根据表的统计信息做出正确的执行计划:
Id=1, 全表扫描
Id=99, 索引扫描
因为这样的选择代价是最小的。从10g开始, oracle已经彻底丢弃了RBO。即使在表、索引没有被分析的时候,oracle依然会使用CBO。此时,oracle会使用一种叫做动态采样的技术,在分析sql的时候,动态的收集表、索引上的一些数据块,使用这些数据块的信息及字典表中关于这些对象的信息来计算出执行计划的代价,进而挑选出最优的执行计划。
比如:
Create table t (x int, y varchar2(2000)); Insert into t select object_id, object_name from dba_objects; Commit; Create index t_ind on t(x); Alter session set sql_trace=true; Select count(x) from t where x <100; Count(x) ------ 98 Alter system flush shared_pool; Set autotrace trace exp; Set linesize 120; Select * from t where x=100;
可以看到,当表没有做分析的时候,oracle会使用动态采样来收集统计信息,这个动作只有在sql执行的第一次,即硬分析阶段使用,后续的软分析将不再使用动态采样,直接使用第一次sql硬分析时生成的执行计划。
CBO优化器有两种可选的运行模式:
(1) FIRST_ROWS(n)
(2) ALL_ROWS
当设置优化器模式为FIRST_ROWS(n)时,意味着oracle在执行sql时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。这种需求在一些网站搜索或者BBS的分页上经常看到,比如每次只查询信息的前20条或BBS的前20个帖子,这时设置FIRST_ROW(n)就非常合适,优化器并不需要同时将所有符合条件的结果返回。比如:
Select /*+ first_rows(10) */ b.x, b.y
from (select /*+ first_rows(10) */ a.*, rownum rnum
from (select /*+ first_rows(10)*/ * from t order by x) a where rownum <= 20) b
where rnum >= 10;
这是一个典型的分页的例子,每次从结果取出10条记录。需要注意的是,排序使用的字段x必须创建有索引,否则CBO会忽略FIRST_ROWS(N)而使用ALL_ROWS.
ALL_ROWS在OLAP系统中使用得比较多,它的目的在于用最快的速度获得sql执行的最后一条记录,而不是前n条数据。和FIRST_ROWS(n)正好相反,ALL_ROWS强调sql整体的执行效率,而FIRST_ROWS(n)强调以最快的速度返回前n行,而不管所有的结果返回时长,可能最后一条要很长时间之后才能获得。
发表评论
-
<让oracle跑得更快-7> AWR性能报告
2015-03-01 22:45 2073AWR是oracle 10g下提供的一 ... -
<让oracle跑得更快-6> 绑定变量
2015-02-28 21:52 1197变量绑定是OLTP系统中一 ... -
<让oracle跑得更快-5> 执行计划
2015-02-28 21:48 1228如果要分析某条(不是整体性能,后面还会讲到awr报告,会再次说 ... -
<让oracle跑得更快-3> latch和等待
2015-02-27 21:18 1125经常有人把latch造成的 ... -
<让oracle跑得更快-2> 锁和阻塞
2015-02-26 22:24 11282.1 锁和阻塞 首先,注意区别并发(concurrency) ... -
<让oracle跑得更快-1> 引起数据库性能问题的因素
2015-02-26 22:04 1499此《让oracle跑得更快》 ... -
OLTP(联机事务处理)和OLAP(联机分析处理) 【转】
2015-02-12 14:13 1210做数据库优化时,一定要先了解数据库支撑的应用特点,不同类型的应 ... -
<oracle优化>(url收藏)
2015-02-11 22:18 7871. CBO & RBO Rule Based Opt ... -
<oracle-11> 数据类型
2015-02-08 20:06 2503选择一个正确的数据类 ... -
<oracle-10> 索引
2015-02-01 21:19 1985索引是应用设计和开发的一个重要方面。如果有太多的索引,修改(插 ... -
<oracle-9> 数据库表
2015-01-30 15:44 12809.1 表类型 Oracle主要有 ... -
<oracle-8> redo和undo
2015-01-26 22:23 1622本章介绍oracle数据库中 ... -
<oracle-7> 事务
2015-01-26 11:07 1516事务(transaction)是数 ... -
<oracle-6> 并发多版本控制
2015-01-12 21:17 14256.1 什么是并发控制 并 ... -
<oracle-5> 锁(lock)和闩(latch)
2015-01-07 21:11 2699开发多用户、数据库驱动的应用时,最大的难点之一是:一方面要力争 ... -
<oracle-4> oracle进程
2015-01-06 23:02 1362Oracle中的各个进程要完成某个特定的任务或一组任务,每个进 ... -
<oracle-3> 内存结构
2015-01-05 22:20 1514这一篇主要讨论oracle的3 ... -
<oracle-2> oracle文件
2014-12-22 20:57 1102与oracle实例相关的文件只有下面几种: 参数文件(para ... -
<Oracle-1> oracle体系结构概述
2014-12-21 22:02 1165本系列主要参考《Oracle ...
相关推荐
第4章 优化器 66 4.1 rbo基于规则的优化器 66 4.2 cbo基于成本的优化器 69 第5章 执行计划 85 5.1 cardinality (基数) 85 5.2 sql的执行计划 94 第6章 hint 109 6.1 和优化器相关的hint 115 6.1.1 all_rows和first_...
<module>flink-optimizer</module> <module>flink-streaming-java</module> <module>flink-streaming-scala</module> <module>flink-connectors</module> <module>flink-formats</module> <module>flink-...
第4章 优化器 66 4.1 rbo基于规则的优化器 66 4.2 cbo基于成本的优化器 69 第5章 执行计划 85 5.1 cardinality (基数) 85 5.2 sql的执行计划 94 第6章 hint 109 6.1 和优化器相关的hint 115 6.1.1 all_rows和first_...
<prop key="hibernate.cglib.use_reflection_optimizer"> true </prop> <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </prop> <prop key=...
Laravel开发-laravel-image-optimizer Laravel图像优化器
该压缩包为Ranger 优化器(性能优于Adam)- a synergistic optimizer using RAdam (Rectified Adam) and LookAhead in one codebase。
Oracle在执行一个SQL之前,首先要分析一下语句的执行...分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。
mg-maven-资源优化器 简单的Maven插件,可在构建时将gzip JS和CSS文件压缩。 除了Maven本身,没有其他依赖项。 Maven依赖 Maven软件包发布在Github上: : 用法: <plugin> <groupId>com.manikanta</groupId> ...
orca-a-modular-query-optimizer-architecture-for-big-data.pdf
Fribbels Epic 7齿轮优化器 这是用于为Epic 7组织齿轮并优化齿轮和单元构建的工具。齿轮装置非常耗时,而且在游戏中很难找到最佳齿轮组合,因此我这样做是为了帮助简化齿轮安装过程。 快来加入Fribbels E7 ...
开源项目-jontonsoup4-taco-bell-optimizer.zip,Taco Bell as a service: API server written in Go
火炬优化器 torch-optimizer -- 与模块兼容的优化器集合。简单的例子 import torch_optimizer as optim# model = ...optimizer = optim . DiffGrad ( model . parameters (), lr = 0.001 )optimizer . step ()安装...
Proguard4.2.zip(java编码混淆器)<br>doc是4.0的doc<br>jar包是1.4.2<br><br><br>ProGuard, Java class file shrinker, optimizer, and obfuscator<br>===========================================================...
前端开源库-fis3-optimizer-minifierFIS3优化器小型化,FIS3 HTML小型化
ORACLE的优化器共有3种 A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。 ...
根据Windows版本的不同,优化器还允许您执行一些特定的调整。 支持 Windows10/11 软件特点:全语言支持(提供19种语言);提高系统和网络性能;禁用不必要的窗口服务;禁用 Windows 遥测、小娜等;禁用办公室遥测...
基于减法平均的优化器Subtraction-Average-Based Optimizer
Oracle的优化器共有3种:RULE(基于规则)、COST(基于成本)、CHOOSE(选择性)。设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你当然也在SQL句...