[Oracle] oracle统计信息
Oracle统计信息
Oracle数据库里的统计信息可以分为6种类型:
- 表的统计信息
- 索引的统计信息
- 列的统计信息
- 系统统计信息
- 数据字典统计信息
- 内部对象统计信息
图 1: Oracle统计信息
基于CBO成本计算的几个重要概念:
Cardinality (集的势)
含义:
Cardinality可以理解为SQL扫描后所得到的集合
计算公式:
Cardinality=MAX(Cardinality Factor * Rowcount, 1)
Cardinality Factor计算
1) "="查询
Cardinality Factor = 1/NUM_DISTINCT
2) ">", "<", ">=", "<="查询
Cardinality Factor = (1/NUM_DISTINCT) + (1/NUM_ROWS)
3) in查询
Cardinality Factor = in_count/NUM_DISTINCT
4) "<>"查询
Cardinality Factor = (1 - (1/NUM_DISTINCT))
5) not in查询
Cardinality Factor = (1 - (1/NUM_DISTINCT)) ^ (not_in_count)
Selectivity (选择度)
含义:
Selectivity可以理解为SQL中谓词过滤结果集和报错表记录数之间的比例 -:)
从选择度的强弱来看, 接近1表示弱选择性, 几乎full table scan; 然而接近0表示强选择性, 既通过index过滤后可以得到目标结果集.
图 2: Selectivity强弱
图 3: Selectvity scan
Selectivity实例
1) 没有null值的等值查询Selectivity计算公式:
selectivity_without_null = (1/NUM_DISTINCT)
2) 有null值的等值查询Selectivity计算公式:
selectivity_with_null = (1/NUM_DISTINCT) * (NUM_ROWS-NUM_NULLS)/NUM_ROWS
3) ">"查询, 且处于LOW_VALUE和HIGH_VALUE之间
selectivity = ((HIGH_VALUE-VAL) / (HIGH_VALUE-LOW_VALUE)) * Null_AdjustNull_Adjust = (NUM_ROWS - NUM_NULLS) / NUM_ROWS
4) "<"查询, 且处于LOW_VALUE和HIGH_VALUE之间
selectivity = ((VAL-LOW_VALUE) / (HIGH_VALUE-LOW_VALUE)) * Null_AdjustNull_Adjust = (NUM_ROWS - NUM_NULLS) / NUM_ROWS
5) ">="查询, 且处于LOW_VALUE和HIGH_VALUE之间
selectivity = ((HIGH_VALUE-VAL) / (HIGH_VALUE-LOW_VALUE) + 1/NUM_DISTINCT) * Null_AdjustNull_Adjust = (NUM_ROWS - NUM_NULLS) / NUM_ROWS
6) ">="查询, 且处于LOW_VALUE和HIGH_VALUE之间
selectivity = ((VAL-LOW_VALUE) / (HIGH_VALUE-LOW_VALUE) + 1/NUM_DISTINCT) * Null_AdjustNull_Adjust = (NUM_ROWS - NUM_NULLS) / NUM_ROWS
7) ">,<"查询, 且处于LOW_VALUE和HIGH_VALUE之间
selectivity = ((VAL2-VAL1)/(HIGH_VALUE-LOW_VALUE) + 2/NUM_DISTINCT) * Null_AdjustNull_Adjust = (NUM_ROWS - NUM_NULLS) / NUM_ROWS
Clustering factor (聚簇因子)
含义:
按照索引建值排序的索引行和存储于对应表中数据行的存储顺序的相似程度;
算法:
1) Clustering factor初始值为1
2) 从index最左边的叶子块开始
3) 最左边叶子块的第一个索引健值所在的索引行开始顺序扫描, 在顺序扫描的过程中, 比对当前索引行的rowid和它之前的那个索引行的rowid, 如果这两个rowid并不是指向同一个表块, 那么聚簇因子++; 如果这两个rowid指向同一个表块, 那么不改变聚簇因子当前值
4) 持续3步骤, 直到顺序扫描完目标索引所有叶子块里的所有索引行
聚簇因子高的索引走index range scan时比相同条件下聚簇因子低的的索引要耗费更多的物理IO, 所以聚簇因子高的索引走index range scan的成本会比相同条件下聚簇因子低的索引走index range scan的成本高.
算法实例
图 2: 聚簇因子计算实例
这是一个比较极端的例子, 在index的没有任何相邻索引行记录的rowid中指向表中相同的数据块, 按照上面的算法可以得到聚簇因子是20;
降低目标index的聚簇因子唯一方法就是对表中数据按照目标index的索引健值排序后重新存储.
CBO在做index range scan时的成本计算公式:
IRS_Cost = I/O Cost + CPU CostI/O Cost = Index Access I/O Cost + Table Access I/O CostIndex Access I/O Cost = BLEVEL + CELL(#LEAF_BLOCKS * IX_SEL)Table Access I/O Cost = CEIL(CLUSTERING_FACTOR * IX_SEL_WITH_FILTERS)
可以看出成本几乎和聚簇因子成正比.
依稀记得那时2013年, 那会我还在某鹅厂做Game DBA的工作, 当时负责的游戏中有两款是Oracle Database的(都是棒子开发的, CF和AVA), 有一次业务发布后发现AVA DB机器IO负载过大的问题, 深入去分析和定位最后发现是index效果不太好, 导致Physical Read和Logical Read很高, 从而造成IO压力 -_-
大致的方法就是:
CPU/IO ? -> AWR -> Segments by Physical Reads ? -> Object Name(SQL) ->
Trace/Explain -> Physical Read/Logical Read/A-Rows/E-Rows -> Adjust Idex(Data distrubitu)
详细可以参考
转载于:https://www.cnblogs.com/renolei/p/4773684.html
[Oracle] oracle统计信息相关推荐
- oracle收集统计计划,oracle收集统计信息之analyze
oracle收集统计信息之analyze 1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息 收集表的统计信息Analyze table tablename ...
- 验证Oracle收集统计信息参数granularity数据分析的力度
最近在学习Oracle的统计信息这一块,收集统计信息的方法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, ---所有者名字 tabname ...
- oracle收集统计信息之analyze
oracle收集统计信息之analyze 1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息 收集表的统计信息Analyze table tablenam ...
- Oracle收集统计信息
Oracle收集统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV ...
- oracle统计信息内容,oracle搜集统计信息
转自http://blog.sina.com.cn/s/blog_69e7b8d701019cal.html 这里的统计信息指的是优化器(OPTIMIZER)统计信息,当Oracle数据库工作在CBO ...
- Oracle收集统计信息之NO_INVALIDATE参数
Oracle收集统计信息之NO_INVALIDATE参数 Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约束会将SQL语句分为不同的成本结构等级.而CBO ...
- oracle更新统计信息执行计划,为准确生成执行计划更新统计信息-analyze与dbms_stats...
如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息. 例如索引跳跃式扫描(INDEX ...
- oracle收集统计信息sql,Oracle自动统计信息的收集原理及实验
从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息.这个自动任务默认情况下在工作日晚上10: ...
- oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...
这个是老生产谈的事情,统计信息不准确导致sql执行异常,此次记录的主要是表的统计信息被锁住导致无法正常收集统计信息导致sql执行异常: 收集表的统计信息: SQL> exec DBMS_STAT ...
- oracle收集统计信息和直方图,oracle统计信息和直方图
oracle统计信息和直方图的理解[@more@]以前一直对统计信息的理解就是对行的数据分布的,提供改CBO来选择高效的执行计划.这段时间看了不少资料,对统计有了一个更清晰的认识 统计信息: 1,表中 ...
最新文章
- 559.N叉树的最大深度
- 易中天与单田芳的区别在哪儿
- java数据同步处理_Java如何处理多线程的数据同步问题
- astype函数_从Excel到Python:最常用的36个Pandas函数!最完整的Pandas教程!
- 机器学习算法总结--朴素贝叶斯
- java redis rpush_Redis Rpush命令
- 55天 - 贪心算法 - 田忌赛马问题 openjudge百炼 2287
- Ubuntu8.10下迁移SVN版本库到新增的SAS硬盘
- 导出数据报ORA-39002: 操作无效 ORA-39070: 无法打开日志文件。 ORA-39087: 目录名 DUMP_DIR 无效...
- 简单的字段类型定义(新新手看)
- 【操作系统】实验四 主存空间的分配和回收
- Linux vim编辑器简单使用之二:vim操作快捷键、小技巧
- 012-JDK可视化监控工具-jstack
- uni-app请求后台接口方法封装
- 什么是串口并行,串口接行
- python从1加到100的其中两种方式
- bat脚本删除文件夹下的重复文件
- 朴实无华!注意力机制神经网络解析
- HTML、CSS、JavaScript 学习笔记
- svg去掉黑色自带背景图