一、优化器分类
Oracle7和Oracle8有两种类型的优化程序:允许您导出SQL语句的执行计划
-基于规则的优化程序(RBO ) )。
使用从Oracle6继承的一组严格规则确定每个SQL语句的执行计划。 如果你知道这些规则
可以创建SQL查询以按指定方式访问数据。 表的内容不影响计划的执行。
此优化程序不再增强,因此无法使用许多oracle8特性。
-基于成本的优化程序(CBO ) )。
是从Oracle7引入的。 为了最大限度地提高吞吐量或初始响应时间,此优化程序正在寻找以最低成本访问数据的方法。
计算不同执行计划的成本,选择成本最低的一个。 有关表中数据内容的统计信息将用于确定执行计划。
基金点的基本点
每个SQL语句都有许多可执行的计划。 “最佳计划”无论达到多少,始终是“最佳计划”。
最佳方案有两层含义。
1此计划使用最小的资源来处理与语句相关的所有行。 称为ALL_ROWS]
2此计划将在最短时间内返回此语句的第一行。 称为FIRST_ROWS]
CBO不了解应用的相关特性,也不能完全理解相关表之间复杂关系的影响。 只有有限的信息可以用于确定最佳计划。
CBO计算各种执行方案的估计成本以确定最佳计划,并选择最低成本的计划。 因为这关系到相关成本的假设,
选定的计划不一定是真正最好的计划。 这经常作为错误报告给oracle技术支持,因为CBO没有为特定方案选择最佳计划。
二.直方图
从10g版开始,Oracle将自动收集Histogram。 Histogram是否收集取决于col_usage$中记录的将此列用作SQL谓词条件的信息和数据分布。
SMON会定期刷新col_usage$表中shared pool谓词的使用情况。
例如:
选择*从tab where cola=1;
对colA记录为equality _ preds-equality predicates等式谓词
二. CBO何时使用直方图
Oracle优化程序优化程序有两个使用Histogram:的位置
过滤谓词的选择性评估
连接基数(Cardinality )评估
评估连接基数(Cardinality )时,往往相差数千英里。
优化程序可能会选择错误的连接方法或顺序。
例如,页面排序查询由于基数评价的误差而使用了HASH JOIN… .
三.直方图bucket桶数
Histogram的备份桶数
大多数情况下,它总是适合默认的75桶
最大桶数=最小值(254,其他因素限制桶数) )。
在频繁发生的distinct值的数据不多的情况下,将桶的数量设定得比该数量大往往是有益的。
四.直方图分类
12c版以前有两种类型的Histogram
1、高平衡直方图
列值被拆分为多个buckets
每个bucket包含几乎相同数量的行数
对于NDV254,将采用高平衡直方图。 (请注意,由dbms_stats采样的NDV不一定是实际的NDV。 )
特点:
除了最后一桶之外,每个buckets桶的行数几乎相同
最后一桶可能比其他桶少
每个桶的最大值为bucket value endpoint_value
各值占水桶的一部分,呈比例
2、frequency histogram (基于值)频率直方图
此列中的每个值都有频率信息
在ndv(numberofdistinctvalues )个数=最大桶数buckets 254个的情况下使用频率直方图
特点:
每个bucket桶都表示列的值
列中的所有值都有对应的桶
NDV (被采样)时
density=1/(2*numrows*a4nulls ) ) ) ) ) ) ) ) )。
五.看
列的统计信息可以以柱状统计图的形式保存。 柱状统计图为列数据提供准确的描述信息。 特别是在数据列有倾斜的情况下,某个值的记录行数非常多,某个值的记录行数非常少。 Oracle包含两种类型的柱状统计图表:高度方形图表(height-balanced )和频率直方图(frequency histograms ),此类型为视图) tab_col_statistics
FREQUENCY或 NONE(1)高度直方图高度直方图中,数据列的值被分成组,每组包含的数据数据可数基本相等。比如有一个列c其值在1到100之间,当均匀分布,其列的高度直方图如下图:
每个间隔中都包含数据列的10行数据;当不均匀分布时其列直方图如下图
这时,大多数数据行的值为5。查询时最有价值的统计信息就是各个组范围的两个端点的值.
查看统计信息的语法如下:
BEGIN
DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',
METHOD_OPT => 'FOR COLUMNS SIZE 6 SAL');
END;
/
SELECT column_name, num_distinct, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'EMP' AND column_name = 'SAL';
结果:
SELECT endpoint_number, endpoint_valueFROM USER_HISTOGRAMSWHERE table_name = 'EMP' and column_name = 'SAL'ORDER BY endpoint_number;结果:
上图中,每行对应高度直方图中的每个间隔。
(2)频率直方图在频率直方图中,列中每个唯一数据相当于高度直方图中的每个间隔,其高度对应该数据在列中出现的次数。当列中distinct值得个数小于或等于直方图的分格段的个数(即num_buckets的值)时,频率直方图会被自动建立。查看频率直方图的语法如下:
BEGIN
DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',
METHOD_OPT => 'FOR COLUMNS SIZE 12 SAL');
END;
SELECT column_name, num_distinct, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'EMP' AND column_name = 'SAL';
结果:
SELECT endpoint_number, endpoint_valueFROM USER_HISTOGRAMSWHERE table_name = 'EMP' and column_name = 'SAL'ORDER BY endpoint_number;结果:
整理的时候发现下面两篇文章也不错