Oracle优化器
Oracle优化器的作用就是为查询语句选择更有效的返回结果的路径。优化器分为两种:RBO和CBO。即分别是基于规则的和基于成本的优化器。
顾名思义,基于规则的优化器,在选择语句的执行路径时,是基于一系列带有优先级的规则来做决定。使用RBO时人工参与语句优化的手段有限。RBO在10g开始不再被支持,但是仍然可以通过修改优化器模式来使用。
CBO在oracle7中被引入,基本思想是给一条SQL语句的所有执行计划制定一个统一的度量,然后给所有执行计划“标价”,这个标注的价格就是执行计划的cost。要把cost算清楚需要两个重要元素:执行计划中数据对象的统计信息和cost算法。统计信息表征了数据对象本身影响执行计划效率的属性,比如行数,唯一键值数等等;cost算法将这些信息处理成具有统一标准的数值,作为cbo选择执行计划的依据。本文主要讨论统计信息的相关概念和原理。
收集统计信息的方法
统计信息的收集有两种方法:
1. 使用dbms_stats包
2. 使用analyze命令
系统统计信息由dbms_stats包产生。
统计信息储存在数据字典表里,cache在share pool中。
dbms_stats包会产生下列内容的统计信息:
表:
rows,blocks,average row length,global statistics,user statistics,sample size,last analyzed
列:
number of distinct values(NDV),number of nulls,data distribution(histogram),
索引:
number of leaf blocks,levels,clustering factor
系统统计信息:
IO performance and utilization
CPU performance and utilization
表统计信息
相关视图:dba_tables, dba_tab_[sub]partitions
用来计算:
1. 表和(子)分区的访问成本
2. Join的基数
3. Join的顺序
表统计信息有下面几个比较重要的内容:
1. num_rows:这是计算基数的基本要素。尤其对于做表连接的驱动表而要,表的行数尤其重要,它决定了被驱动表要被探测多少次。
2. blocks(exact):blocks是指已使用的数据块数(used data blocks)。使用block数与db_file_multiblock_read_count参数可以大体计算出表访问的成本。
3. avg_row_len:表每行的平均长度,单位为字节。
表统计信息物理的储存在sys.tab$数据字典表里,下面三种统计信息只有在使用analyze命令的时候才会收集:empty_blocks(表中从未使用过的数据块数