- 浏览: 458061 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (538)
- C/C++ Primer (69)
- Objective-C Primer (102)
- Python Primer (19)
- JavaScript Primer (1)
- Java Primer (37)
- PHP Primer (17)
- 泛 Linux (37)
- Shell Script (21)
- APUE (21)
- UNP__1&2 (19)
- NetWork (7)
- Oracle周边 (38)
- Mysql里边 (6)
- Windows技 (9)
- 简单算法 & 数据结构 (14)
- 设计模式 (6)
- GTK历程 (12)
- 工具使用 (25)
- 杂事 (23)
- 一些概念 (17)
- Web方面 (10)
- myCodeTools (9)
- ^未 竟$ (13)
- 硬件通信 (2)
- Games (1)
最新评论
原文地址:http://www.blogjava.net/wxqxs/archive/2008/08/13/221716.html
1、基于规则的优化方式(Rule-Based Optimization,简称为RBO)
优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则,对数据是不敏感的。它只借助少量的信息来决定一个sql语句的执行计划,包括:
1)sql语句本身
2)sql中涉及到的table、view、index等的基本信息
3)本地数据库中数据字典中的信息(远程数据库数据字典信息对RBO是无效的)
1)sql语句本身
2)sql中涉及到的table、view、index等的基本信息
3)本地数据库中数据字典中的信息(远程数据库数据字典信息对RBO是无效的)
例如:我们常见的,当一个where子句中的一列有索引时去走索引。但是需要注意,走索引不一定就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时全表扫描(full table scan)的效率更优。
2、基于代价的优化方式(Cost-Based Optimization,简称为CBO)
它是看语句的代价(Cost),通过代价引擎来估计每个执行计划所需的代价,该代价将每个执行计划所耗费的资源进行量化,CBO根据这个代价选择出最优的执行计划。一个查询所耗费的资源可分为三部分:I/O代价、CPU代价、NETWORK代价。I/O是指把数据从磁盘读入内存时所需代价(该代价是查询所需最主要的,所以在优化时一个基本原则就是降低I/O总次数);CPU代价是指处理内存中数据所需的代价,数据一旦读入内存,当我们识别出我们所要的数据后,会在这些数据上执行排序(sort)或连接(join)操作,这需要消耗CPU资源;对于访问远程节点来说,network代价的花费也是很大的。
优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有多少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息(dbms_stat.analyze)。
如星型连接排列查询,哈希连接查询,函数索引,和并行查询等一些技术都是基于CBD的。
3、优化模式包括Rule、Choose、First rows、All rows四种方式:
Rule:基于规则的方式。
Choolse:默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走RBO的方式。
4、设定选用哪种优化模式:
A、在initSID.ora中设定OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS(默认是Choose)
B、Sessions级别通过:ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS
C、语句级别用Hint(/*+ ... */)来设定
B、Sessions级别通过:ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS
C、语句级别用Hint(/*+ ... */)来设定
5、一些常见的问题:
A、为什么表的某个字段明明有索引,但执行计划却不走索引?
1、优化模式是all_rows的方式
2、表作过analyze,有统计信息
3、表很小,上文提到过的,Oracle的优化器认为不值得走索引。
2、表作过analyze,有统计信息
3、表很小,上文提到过的,Oracle的优化器认为不值得走索引。
B、使用CBO时,SQL语句中为什么不能引用系统数据字典表或视图?
1、因为系统数据字典表都未被分析过,可能导致极差的“执行计划”。
2、擅自对数据字典表做分析,可能导致死锁,或系统性能严重下降。
C、使用CBO时如何选择表连接方式?
1、CBO有时会偏重于SMJ和HJ,但在OLTP系统中,NL一般会更好,因为它高效的使用了索引。
2、SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。
3、HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。
D、使用CBO时,需要注意什么吗?
1、必须保证为表和相关的索引搜集足够的统计数据, 对数据经常有增、删、改的表最好定期对表和索引进行分析
2、可用SQL语句:analyze table xxx compute statistics for all indexes
E、为什么有时使用CBO会比较慢?
1、没有对表或视图进行Analyze
2、SQL进行CBO时对于没有Analyze的对象会自动进行Analyze,因此造成运行缓慢
发表评论
-
有空玩玩
2011-05-19 15:01 7421、有一个size1000的ector<int>, ... -
Java__ResourceBundle
2011-03-11 09:05 570http://blog.csdn.net/haiyan0106 ... -
日志类
2010-07-22 09:20 49log4c log4cpp log4j 都有源码,要学习学习 ... -
五子棋
2010-07-20 16:48 860copy:http://www.iteye.com/topic ... -
epoll精髓
2010-07-16 17:19 905copy:http://www.cnblogs.com/O ... -
Sed命令-正规则表达
2010-07-08 19:56 458原文地址:http://hi.baid ... -
linux下一个线程占用多少内存
2010-07-08 19:52 2416原文地址:http://blogger.org.cn/blog ... -
Linux__指令SYSCTL
2010-07-08 19:50 899原文地址:http://hi.baidu. ... -
Oracle redo undo commit rollback
2010-07-06 11:39 1100原文地址:http://blog.csdn.net/wh625 ... -
C++的const多种情况
2010-06-30 12:19 18http://blog.gisforum.net/u/2847 ... -
C++ 用new 动态创建多维数组
2010-06-20 19:14 44http://blog.csdn.net/gabby1985/ ... -
Oracle__trunc函数
2010-06-13 18:46 658http://topic.csdn.net/t/2003010 ... -
C++ Virtual
2010-06-09 13:07 29稍后学习。。。 -
jetty
2010-05-31 14:37 42Web Server的东西 -
Class类
2010-05-29 09:00 15未竟未学习呢 -
Field类
2010-05-29 08:46 638java.lang.reflect.Field -
Linux代码自动排版
2010-05-25 15:41 85自动排版还是用vim 好输入ggvG==就行了 ... -
Linux文件传送命令scp
2010-05-25 15:38 1219Linux文件传送命令 SCP(Secure Copy) ... -
Linux内存映射: mmap
2010-05-19 10:51 721http://blog.csdn.net/dai_weitao ... -
PL/SQL
2010-05-13 14:57 11PL/SQL
相关推荐
优化器主要有两种策略:基于规则的优化(RBO)和基于代价的优化(CBO)。理解这两种优化方式以及如何设置优化模式对于数据库管理员和开发人员来说至关重要。 **RBO(基于规则的优化)**: RBO是早期Oracle版本中...
ORACLE CBO RBO 优化
Oracle 优化器可以分为两大类:基于规则的优化器(RBO)和基于成本的优化器(CBO)。 基于规则的优化器(RBO) RBO 是一种 Based on Rule 的优化器,根据可用的访问路径和访问路径的等级来选择执行计划。RBO 访问...
#### CBO优化器结构与组件 CBO由多个关键组件组成,共同协作以生成最优的执行计划: 1. **查询转换器(Query Transformer)**:负责调整查询语句形式,以利于生成更高效的执行计划。这包括视图合并、谓词推进、非嵌...
Oracle优化器主要分为两种:基于规则的优化器(RBO)和基于成本的优化器(CBO)。随着Oracle版本的演进,CBO已成为默认选择,它依赖于统计信息、成本模型和系统性能指标来评估执行计划的成本,并选择成本最低的计划...
CBO自Oracle 7引入,但在Oracle 8i时达到成熟,并在Oracle 9i及以后的版本中逐渐取代RBO成为主要的优化器。RBO基于固定的规则来生成执行计划,而CBO则通过评估各种可能执行计划的成本来选择最佳方案。 CBO的主要...
- **定义**:CBO是从Oracle 8i开始引入的一种新的优化方式,它基于对表和索引的统计信息来评估执行计划的成本。 - **特点**: - 更加智能,能够根据实际数据情况动态选择最佳执行计划。 - 需要定期更新表和索引...
Oracle 优化器有两种模式:CBO(Cost-Based Optimizer)和 RBO(Rule-Based Optimizer)。CBO 是基于成本的优化器,需要使用统计信息,据此计算最佳的执行计划;而 RBO 是基于规则的优化器,根据 Oracle 设定的规则...
通过对具体案例的研究,可以更深入地理解如何利用 Oracle 优化器和执行计划来提高查询性能。案例分析通常包括以下几个步骤: 1. **问题识别**:确定性能瓶颈的具体位置。 2. **原因分析**:找出导致性能问题的根本...
本文主要介绍Oracle中SQL优化器的两种优化方式:基于规则的优化器(Rule-Based Optimizer, RBO)和基于成本的优化器(Cost-Based Optimizer, CBO),以及这两种方式在实际应用中的具体使用。 一、分析SQL语句的执行过程...
首先,Oracle优化器主要有两种模式:基于规则的优化(RBO)和基于代价的优化(CBO)。RBO在早期版本中较为常见,它根据预设的规则来决定查询路径,例如,如果WHERE子句中的字段有索引,那么会选择使用索引。而CBO则...
- 详细介绍了Oracle的优化器,包括CBO方式和RBO方式的区别。 - 讲解了CBO成本的概念及计算,包括CBO COST的概念和计算方法。 - 探讨了CBO的选择性、统计信息的收集方法,以及如何查看和收集对象的统计信息。 - ...
2. **基于成本的优化器(COST)**:这是Oracle默认使用的优化器,它根据数据库对象的统计信息来计算最优的执行计划。为了使基于成本的优化器能够准确地工作,需要定期运行`ANALYZE`命令来收集对象统计信息。 3. **...
首先,Oracle 优化器主要有两种类型:基于规则(Rule-Based Optimizer, RBO)和基于成本(Cost-Based Optimizer, CBO)。RBO根据预定义的规则来选择执行计划,而CBO则是Oracle数据库默认的优化器,它基于对查询执行...
最佳吞吐量目标下,优化器倾向于使用资源最少的方式来处理被语句访问到的所有行,这种策略适用于处理大量数据的批处理应用,如Oracle报表应用程序。最快响应速度目标则专注于快速返回第一行或前几行数据,适用于需要...
8. **优化器模式和提示**:有时候,CBO的决策可能不理想,此时可以使用优化器模式(如Rule-Based Optimizer, RBO)切换或SQL提示来干预执行计划的选择。 9. **资源管理**:Oracle的资源管理功能允许DBA设定不同用户...
优化器根据不同的策略可以分为两种类型:基于规则的优化器(Rule Based Optimizer, RBO)和基于成本的优化器(Cost Based Optimizer, CBO)。这两种优化器的选择和使用直接影响了SQL语句的性能表现。 #### 二、基于规则...