oracle执行计划基数(cardinality)计算方式
2013-04-09 10:36
477 查看
num_rows: dba_tables.num_rows
num_nulls: dba_tab_cols.num_nulls
num_distinct:dba_tab_cols.num_distinct
Card:cardinality基数
oracle执行计划基数(cardinality)计算方式
1.单列无直方图计算方式
Card=(1/num_distinct)*(num_rows-num_nulls)/num_nulls
2.单列有直方图计算方式:
频率直方图:
Bucketsize: 桶内的rowcount dba_tab_histograms.endpoint_value
Card :=Sum(Bucketsize)/num_rows
高度均衡直方图:
popular value值基数计算方式:
PopValBucks:该Popular值的桶数 计算方式如下:
SELECT buckets PopValBucks from (
select endpoint_number, endpoint_value endstr, endpoint_number- lag( endpoint_number,1,0) over (order by endpoint_number )
as buckets from dba_tab_histograms where table_name=:table and column_name=:col )
where endstr=:Popular
num_buckets:总的桶数 DBA_TAB_cols.num_buckets
Card = num_rows * (PopValBucks /num_buckets) * ( (num_rows- num_nulls) / num_rows) ;
非popular value值基数计算方式:
Card =num_rows * Density * (num_rows-num_nulls)/num_nulls
附直方图收集方式:
EXECUTE DBMS_STATS.GATHER_TABLE_STATS
('scott','emp',METHOD_OPT => 'FOR COLUMNS SIZE auto ename');
Method_opt参数
EXECUTE DBMS_STATS.GATHER_TABLE_STATS
('scott','emp',METHOD_OPT => 'FOR COLUMNS SIZE 20 ename');
FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]
FOR COLUMNS [size clause] column [size_clause] [,column...]
SIZE {integer | REPEAT | AUTO | SKEWONLY}
Integer – 人工指定直方图桶数 从1~254
REPEAT - 刷新现有的直方图列上的信息
AUTO - 基于数据分布和负载收集直方图
SKEWONLY- 基于数据分布收集直方图
?Size指定直方图的桶数
?若对直方图不甚了解,推荐使用AUTO或SKEWONLY
参考资料:
http://t.askmaclean.com/thread-2172-1-1.html
num_nulls: dba_tab_cols.num_nulls
num_distinct:dba_tab_cols.num_distinct
Card:cardinality基数
oracle执行计划基数(cardinality)计算方式
1.单列无直方图计算方式
Card=(1/num_distinct)*(num_rows-num_nulls)/num_nulls
2.单列有直方图计算方式:
频率直方图:
Bucketsize: 桶内的rowcount dba_tab_histograms.endpoint_value
Card :=Sum(Bucketsize)/num_rows
高度均衡直方图:
popular value值基数计算方式:
PopValBucks:该Popular值的桶数 计算方式如下:
SELECT buckets PopValBucks from (
select endpoint_number, endpoint_value endstr, endpoint_number- lag( endpoint_number,1,0) over (order by endpoint_number )
as buckets from dba_tab_histograms where table_name=:table and column_name=:col )
where endstr=:Popular
num_buckets:总的桶数 DBA_TAB_cols.num_buckets
Card = num_rows * (PopValBucks /num_buckets) * ( (num_rows- num_nulls) / num_rows) ;
非popular value值基数计算方式:
Card =num_rows * Density * (num_rows-num_nulls)/num_nulls
附直方图收集方式:
EXECUTE DBMS_STATS.GATHER_TABLE_STATS
('scott','emp',METHOD_OPT => 'FOR COLUMNS SIZE auto ename');
Method_opt参数
EXECUTE DBMS_STATS.GATHER_TABLE_STATS
('scott','emp',METHOD_OPT => 'FOR COLUMNS SIZE 20 ename');
FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]
FOR COLUMNS [size clause] column [size_clause] [,column...]
SIZE {integer | REPEAT | AUTO | SKEWONLY}
Integer – 人工指定直方图桶数 从1~254
REPEAT - 刷新现有的直方图列上的信息
AUTO - 基于数据分布和负载收集直方图
SKEWONLY- 基于数据分布收集直方图
?Size指定直方图的桶数
?若对直方图不甚了解,推荐使用AUTO或SKEWONLY
参考资料:
http://t.askmaclean.com/thread-2172-1-1.html
相关文章推荐
- Oracle 执行计划(2)-基数 cardinality【即估算一个操作返回的行数】
- oracle单表选择率(selectivity)——计算执行计划的基数
- (1)oracle单表选择率(selectivity)——计算执行计划的基数
- Oracle 执行计划(2)-基数 cardinality
- Oracle 执行计划(3)-两表连接基数
- Oracle查看执行计划的几种方式
- 【Oracle】三种方式查看SQL语句的执行计划
- Oracle的HINT可以强制指定SQL的执行计划,比如选择索引、表的连接顺序以及表的连接方式等等。(转)
- Oracle查看SQL执行计划的方式
- Oracle获取执行计划的6中方式,以及每种方式的优缺点
- 跟踪查看oracle 执行计划获取的几种方式
- oracle 执行计划 一 执行计划的查看方式
- 浅析Oracle查看执行计划的三种方式
- oracle执行计划之-表连接方式
- Oracle 执行计划查看方式
- oracle 执行计划获取的几种方式
- SQL语句的执行计划(oracle表的三种链接方式)
- oracle编程入门笔记2015-01-18--执行计划中的索引扫描方式说明
- Oracle查看SQL执行计划的方式
- Oracle执行计划中的连接方式nested loops join、sort merge joinn、hash join