数据库CBO具体过程

上传人:枫** 文档编号:497922935 上传时间:2022-07-31 格式:DOC 页数:19 大小:54.50KB
返回 下载 相关 举报
数据库CBO具体过程_第1页
第1页 / 共19页
数据库CBO具体过程_第2页
第2页 / 共19页
数据库CBO具体过程_第3页
第3页 / 共19页
数据库CBO具体过程_第4页
第4页 / 共19页
数据库CBO具体过程_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《数据库CBO具体过程》由会员分享,可在线阅读,更多相关《数据库CBO具体过程(19页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! 我的初步想法是:1。initsid.ora中设置optimizer_mode=rule,2。收集所有表和索引的统计信息3。逐步设置每个session的optimizer_mode=choose,看看效率怎样4。在观察了所有应用的session在cost-based optimizer下运行情况后,设置initsid.ora中的optimizer_mode=choose请大家提出建议,谢谢!OUTLINE?从哪里得到正确的执行计划先在空闲是做analyze ,做个trigger 对测试联接做alter session set optimate_mo

2、de=first_rows;然后是评估是否可行.OK了之后可以在trigger 中对所有的联接做alter session ,或是改init.ora 参数重启数据库祝好运!Oracle优化器的RBO和CBO方式 1、基于规则的优化方式(Rule-Based Optimization,简称为RBO) 优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则,对数据是不敏感的。它只借助少量的信息来决定一个sql语句的执行计划,包括: 1) sql语句本身 2) sql中涉及到的table、view、index等的基本信息 3) 本地数据库中数据字典中的信息(远程数据库数据字典信息对RBO

3、是无效的) 例如:我们常见的,当一个where子句中的一列有索引时去走索引。但是需要注意,走索引不一定就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时全表扫描(full table scan)的效率更优。 2、基于代价的优化方式(Cost-Based Optimization,简称为CBO) 它是看语句的代价(Cost),通过代价引擎来估计每个执行计划所需的代价,该代价将每个执行计划所耗费的资源进行量化,CBO根据这个代价选择出最优的执行计划。 一个查询所耗费的资源可分为三部分:I/O代价、CPU代价、NETWORK代价。I/O是指把数据从磁盘

4、读入内存时所需代价(该代价是查询所需最主要的,所以在优化时一个基本原则就是降低I/O总次数);CPU代价是指处理内存中数据所需的代价,数据一旦读入内存,当我们识别出我们所要的数据后,会在这些数据上执行排序(sort)或连接(join)操作,这需要消耗CPU资源;对于访问远程节点来说,network代价的花费也是很大的。 优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有多少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息(dbms_stat.an

5、alyze)。 如星型连接排列查询,哈希连接查询,函数索引,和并行查询等一些技术都是基于CBD的。 3、优化模式包括Rule、Choose、First rows、All rows四种方式: Rule:基于规则的方式。 Choolse:默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。 First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。 All Rows:也就是我

6、们所说的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(/*+ . */)来设定 5、一些常见的问题: A、为什么表的某个字段明明有索引,但执行计划却不走

7、索引? 1、优化模式是all_rows的方式 2、表作过analyze,有统计信息 3、表很小,上文提到过的,Oracle的优化器认为不值得走索引。 B、使用CBO时,SQL语句中为什么不能引用系统数据字典表或视图? 1、因为系统数据字典表都未被分析过,可能导致极差的“执行计划”。 2、擅自对数据字典表做分析,可能导致死锁,或系统性能严重下降。 C、使用CBO时如何选择表连接方式? 1、CBO有时会偏重于SMJ和HJ,但在OLTP系统中,NL一般会更好,因为它高效的使用了索引。 2、SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。 3、HJ由于须做HASH运算,索引的存在对

8、数据查询速度几乎没有影响。 D、使用CBO时,需要注意什么吗? 1、必须保证为表和相关的索引搜集足够的统计数据, 对数据经常有增、删、改的表最好定期对表和索引进行分析 2、可用SQL语句:analyze table xxx compute statistics for all indexes E、为什么有时使用CBO会比较慢? 1、没有对表或视图进行Analyze 2、SQL进行CBO时对于没有Analyze的对象会自动进行Analyze,因此造成运行缓慢 更加详细的信息可见以下转载: * http:/ CBO 和 RBO gzzg | 10 十一月, 2004 10:16 选择获取路径(ac

9、cess path)1 基于成本(Cost-Based)优化器会根据这些因素来选择获取路径:语句的可用的获取路径估计每个获取路径的成本 选择获取路径(access path)1 基于成本(Cost-Based)优化器会根据这些因素来选择获取路径:语句的可用的获取路径估计每个获取路径的成本优化器第一步会根据 where 子句的条件(和对有 sample 或者 sample block 的 from 子句)得到可利用的获取路径。然后优化器生成执行计划,并根据索引、列和表的统计信息估计每个计划的成本。最后,优化器选择一个成本最低的执行计划。如果有提示(hints)存在的话,那么会覆盖优化器的路径选择

10、,当语句中有 sample 或 sample block 除外。选择可利用的获取路径,优化器考虑以下的因素:选择性(Selectivity):就是查询一个表返回的列的百分比。低百分比查询的选择性要比高百分比的好。对于返回查询结果占表的行数比例比较小的话,使用索引是有效率的,如果比例较大的话,全表扫描会更快一些。为了确定查询的选择性,优化器考虑这些信息: where 子句中使用的操作符 where 子句中使用的唯一键和主键 表的统计信息DB_FILE_MULTIBLOCK_READ_COUNT 参数:全表扫描使用多块读(multiblock read),所以全表扫描的成本取决于一个多块读一次读取

11、的块的数量。因此,当 DB_FILE_MULTIBLOCK_READ_COUNT 参数设置的比较大,那么优化器选择全表扫描的可能性也就比较大。一个例子:SELECT * FROM emp WHERE ename = JACKSON; 如果 ename 是一个唯一性键或是主键,优化器很可能就会使用 unique scan on index 来使用索引。 如果 ename 不是一个唯一性键或是主键,那么优化器就会使用下面的统计信息: USER_TAB_COLUMNS.NUM_DISTINCT 表的每一列的数值的数量 USER_TABLES.NUM_ROWS 表的行数 2 基于规则(Rule-Bas

12、ed)优化器会根据这些因素来选择获取路径:语句的可用的获取路径获取路径的级别优化器第一步会根据 where 子句的条件得到可利用的获取路径,然后选择最高级别的获取路径。全表扫描是最低级别的获取路径,这就意味着再基于规则的优化器如果有索引可以利用,即使全表扫描更有效率,也不会使用全表扫描。Where 子句中的条件的顺序不影响优化器的选择。 获取路径的级别(常用):1 Single row by rowid 4 Single row by unique or primary key 8 Composite key 9 Single-column indexes 10 Bounded range s

13、earch on indexed columns 11 Unbounded range search on indexed columns 12 Sort-merge join 13 MAX or MIN of indexed column 14 ORDER BY on indexed columns 15 Full table scan Single-column indexes :当 Where 子句的等于条件中有一个或者多个单列索引(多个条件必须用 AND 连接)时,查询会使用 Single-column indexes 。如果 Where 子句中只用到有索引的列,Oracle 会在这个

14、索引上执行一个 range scan 获得被选择的行的 rowids ,然后通过这些 rowids 来获得表中的行。如果 where 子句中有多个 Single-column indexes 的列,Oracle 会在每个索引上执行 range scan ,然后将这些返回的 rowids 的集合进行合并,最后再通过这些合并后的 rowids 的集合来获取表中的行。Oracle 最多可以合并 5 个索引,如果 where 子句中使用的Single-column indexes 超过 5 个,那么 Oracle 就先合并 5 个得到一个 rowids 的集合,通过这个 rowids 集合来获取表中的行,再判断这些行是否符合剩下的条件。 Bounded range search on indexed columns :在 where 子句中有以下条件时(既有上限也有下限)column = expr column = expr AND column = expr column BETWEEN expr AND expr co

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 国内外标准规范

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号