Oracle的RBO和CBO详细介绍和优化模式设置方法_oracle

Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO),在Oracle8及以后的版本,Oracle强列推荐用CBO的方式

RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

CBO方式:它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。

注意:走索引不一定就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时全表扫描(full table scan)是最好

优化模式包括Rule、Choose、First rows、All rows四种方式:

Rule:基于规则的方式。

Choolse:默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。

First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。

All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走RBO的方式。

设定选用哪种优化模式:

A、Instance级别我们可以通过在initSID.ora文件中设定OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS如果没设定OPTIMIZER_MODE参数则默认用的是Choose方式。

B、Sessions级别通过ALTER SESSION SET OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS来设定。

C、语句级别用Hint(/*+ ... */)来设定
为什么表的某个字段明明有索引,但执行计划却不走索引?
    1、优化模式是all_rows的方式
    2、表作过analyze,有统计信息(最可能的就是统计信息有误)
    3、表很小,上文提到过的,Oracle的优化器认为不值得走索引。

我们可以查看一下一个表或索引是否是统计信息
    

复制代码 代码如下:

SELECT * FROM user_tables
     WHERE table_name=<table_name>
     AND num_rows is not null;
     SELECT * FROM user_indexes
     WHERE table_name=<table_name>
      AND num_rows is not null;

     当我们使用CBO的方式,就应当及时去更新表和索引的统计信息,以免生形不切合实的执行计划。
    
复制代码 代码如下:

ANALYZE table table_name COMPUTE STATISTICS;
     ANALYZE INDEX index_name ESTIMATE STATISTICS;

时间: 2024-07-28 20:41:54

Oracle的RBO和CBO详细介绍和优化模式设置方法_oracle的相关文章

Oracle SQL Developer显示的时间包含时分秒的设置方法_oracle

Oracle SQL Developer是Oracle公司出品的一个免费的集成开发环境.Oracle SQL Developer 是一个免费非开源的用以开发数据库应用程序的图形化工具,使用 SQL Developer 可以浏览数据库对象.运行 SQL 语句和脚本.编辑和调试 PL/SQL 语句.另外还可以创建执行和保存报表.该工具可以连接任何 Oracle 9.2.0.1 或者以上版本的 Oracle 数据库,支持 Windows.Linux 和 Mac OS X 系统.    那么如何设置让O

oracle查询不含括号及不含指定字符的方法_oracle

oracle查询不含括号不含指定字符的记录方法如下: with tmp_t as( select 1 as id,'测试4321_CS' as name from dual union all select 2,'测试 1200(测试版)' from dual union all select 3,'测试123(测试版)' from dual union all select 4,'测试 1212(D2)' from dual union all select 5,'测试 1212(D2)测试版

Oracle客户端 NLS_LANG 的设置方法_oracle

Oracle客户端NLS_LANG设置 OracleWindowsMicrosoftUnixBash 1. NLS_LANG 参数组成 NLS_LANG参数由以下部分组成: NLS_LANG=<Language>_<Territory>.<Clients Characterset> NLS_LANG各部分含义如下: LANGUAGE指定: -Oracle消息使用的语言 -日期中月份和日显示 TERRITORY指定 -货币和数字格式 -地区和计算星期及日期的习惯 CHAR

PB7 连接 Oracle 的设置方法_oracle

正在看的ORACLE教程是:PB7 连接 Oracle 的设置方法.  系统环境: 1.操作系统:Windows 2000 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 访问方法: 1.首先安装好Oracle客户端应用程序,确保Oracle网络连通 配置C:\Oracle\Ora81\network\ADMIN\tnsnames.ora文件, 创建连接到服务器的数据库别名 注: 服务器端Oracle数据库实例名:oradb 服务器

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)_oracle

oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: * 存储过程和函数以命名的数据库对象形式存储于数据库当中.存储在数据库中的优点是很明显的,因为代码不保存在本地,用户

oracle中动态SQL使用详细介绍_oracle

1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.

Oracle 多行记录合并/连接/聚合字符串的几种方法_oracle

什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nullable Default Comments ------- ------------ -------- ------- -------- COUNTRY VARCHAR2(20) Y CITY VARCHAR2(20) Y SQL> select * from test; COUNTRY CITY -------------------- -------------------- 中国 台

11g Oracle导出表不导出数据默认为空表的解决方法_oracle

11g oracle导出表时会默认不导出数据为空 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_

ORACLE EXP不能导出空表的原因分析及解决方法_oracle

一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_segment_creat