Oracle统计信息

Oracle数据库里的统计信息可以分为6种类型:

  • 表的统计信息
  • 索引的统计信息
  • 列的统计信息
  • 系统统计信息
  • 数据字典统计信息
  • 内部对象统计信息

图 1: Oracle统计信息


基于CBO成本计算的几个重要概念:

  1. 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)
  2. 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
  3. 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统计信息相关推荐

  1. oracle收集统计计划,oracle收集统计信息之analyze

    oracle收集统计信息之analyze 1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息 收集表的统计信息Analyze table tablename ...

  2. 验证Oracle收集统计信息参数granularity数据分析的力度

    最近在学习Oracle的统计信息这一块,收集统计信息的方法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, ---所有者名字 tabname ...

  3. oracle收集统计信息之analyze

    oracle收集统计信息之analyze 1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息  收集表的统计信息Analyze table tablenam ...

  4. Oracle收集统计信息

    Oracle收集统计信息 优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN: 列统计: --列中唯一值的数量(NDV ...

  5. oracle统计信息内容,oracle搜集统计信息

    转自http://blog.sina.com.cn/s/blog_69e7b8d701019cal.html 这里的统计信息指的是优化器(OPTIMIZER)统计信息,当Oracle数据库工作在CBO ...

  6. Oracle收集统计信息之NO_INVALIDATE参数

    Oracle收集统计信息之NO_INVALIDATE参数 Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约束会将SQL语句分为不同的成本结构等级.而CBO ...

  7. oracle更新统计信息执行计划,为准确生成执行计划更新统计信息-analyze与dbms_stats...

    如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息. 例如索引跳跃式扫描(INDEX ...

  8. oracle收集统计信息sql,Oracle自动统计信息的收集原理及实验

    从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息.这个自动任务默认情况下在工作日晚上10: ...

  9. oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...

    这个是老生产谈的事情,统计信息不准确导致sql执行异常,此次记录的主要是表的统计信息被锁住导致无法正常收集统计信息导致sql执行异常: 收集表的统计信息: SQL> exec DBMS_STAT ...

  10. oracle收集统计信息和直方图,oracle统计信息和直方图

    oracle统计信息和直方图的理解[@more@]以前一直对统计信息的理解就是对行的数据分布的,提供改CBO来选择高效的执行计划.这段时间看了不少资料,对统计有了一个更清晰的认识 统计信息: 1,表中 ...

最新文章

  1. 559.N叉树的最大深度
  2. 易中天与单田芳的区别在哪儿
  3. java数据同步处理_Java如何处理多线程的数据同步问题
  4. astype函数_从Excel到Python:最常用的36个Pandas函数!最完整的Pandas教程!
  5. 机器学习算法总结--朴素贝叶斯
  6. java redis rpush_Redis Rpush命令
  7. 55天 - 贪心算法 - 田忌赛马问题 openjudge百炼 2287
  8. Ubuntu8.10下迁移SVN版本库到新增的SAS硬盘
  9. 导出数据报ORA-39002: 操作无效 ORA-39070: 无法打开日志文件。 ORA-39087: 目录名 DUMP_DIR 无效...
  10. 简单的字段类型定义(新新手看)
  11. 【操作系统】实验四 主存空间的分配和回收
  12. Linux vim编辑器简单使用之二:vim操作快捷键、小技巧
  13. 012-JDK可视化监控工具-jstack
  14. uni-app请求后台接口方法封装
  15. 什么是串口并行,串口接行
  16. python从1加到100的其中两种方式
  17. bat脚本删除文件夹下的重复文件
  18. 朴实无华!注意力机制神经网络解析
  19. HTML、CSS、JavaScript 学习笔记
  20. svg去掉黑色自带背景图

热门文章

  1. (2)搞一搞 seata 之 Spring Cloud 整合
  2. 如何用python画爱心型线_python怎么画爱心
  3. 网络推广外包运营浅析美的成立科技公司旨在依靠科技创新实现突破
  4. 网络推广——网络推广专员浅析新站应该如何提升长尾关键词的排名
  5. 网络营销外包——网络营销外包专员是怎样提升网站收录概率的?
  6. css 圆形背景icon_我写CSS的常用套路(附demo的效果实现与源码)
  7. 开发日记 20210316
  8. 趣谈网络协议笔记-二(第七,八,九讲)
  9. 单元测试以及dagger的使用
  10. cassandra的全文检索插件