什么是优化器统计信息?----系列二
来源:互联网 发布:sql授权语句 编辑:程序博客网 时间:2024/05/02 01:54
什么是优化器统计信息?----系列二
优化器统计信息是一堆描述数据库及数据库中对象特征的数据,优化用这些统计信息来为每个sql语句选择最优的执行计划。统计信息存储在数据字典中,可以通过user_tab_statistics数据库字典视图获取,优化器统计信息和那些通过v$视图获取的性能统计信息是不一样的,v$视图记录的是system的状态信息及在系统执行的sql负载信息。
表和列的统计信息
表的统计信息包含:表的行数,表已使用的block数,平均行长度。优化器使用这些统计信息及额外的统计信息,来计算执行计划中不同操作的成本开销,并且估算某个操作会涉及的数据行数。例如,访问一张表的开销是通过计算所需访问的数据块数相关的参数为:db_file_multiblock_read_count。可以通过访问user_tab_statistics视图来访问表的统计信息。
列的统计信息包括:列中非重复值的数量(NDV),列中的最大值和最小值。我们可以通过user_tab_col_statistics视图来查看列的统计信息,优化器使用列的统计信息和表的统计信息,来估算一个sql操作会返回的行数。例如,一张表有100条记录,通过一个“等于”的条件来对表的一个只有10个非重复值列进行查询,假定优化器认为数据是均匀分布的,通过总的数据行数除以非重复值数(100/10=10 ‘num_rows’/‘num_distinct‘)来评估基数(cardinlity).
如下例所示:
附加的列统计信息
基表和列的统计信息只能把表和列的大致信息告诉优化器,但不能把表或列中真实的数据分布信息传递给优化器。比如,统计信息不能告诉优化器列中数据的倾斜情况,或者表中列间的相关性信息。可以通过扩展基本的统计信息,如使用直方图(histogram),列组(columns groups),expression statistics来给优化器传递数据的本质信息。
直方图(histograms)
直方图反应了列中的数据分布情况。在默认没有直方图的情况下,优化器认为列中的数据根据列中的非重复值均匀分布的。据上所述,优化器通过(‘num_rows’/‘num_distinct‘)来为一个等于谓语估算基数。如果数据不是统一均匀分布的,那么基数的估算一定是不正确的。为了准确的反应非均匀数据的分布,最好是在列上使用直方图。直方图的出现改变了以往优化器评估基数的方式,可以生成更精确的执行计划。
Oracle根据列的使用信息(sys.col_usage$),及数据倾斜情况自动决定在列上是否使用直方图。例如,oracle不会在只有‘等价‘谓语条件的唯一列上创建直方图
直方图的类型有2种:frequency(频率直方图),height-balanced(高度均衡直方图)。Oracle根据列上非重复值的数量来决定直方图的类型。
Frequency histogram
当列中非重复值少于254个时oracle会使用频率直方图。
Oracle使用以下步骤来创建频率直方图:
假设oracle在表PROMOTIONS的PROMO_CATEGORY_ID列上创建频率直方图。第一步根据promo_category_id排序获取promo_category_id的值。
每个promo_category_id 会被分配到自己直方图桶中。
在这个阶段,我们可以拥有超过254个histogram bucket,但那些拥有相同值的桶可以压缩到那些拥有相同值,且更高的桶中。在下面的案例中,bucket 2到bucket 115之间的会被压缩到bucket 115中,bucket 484到bucket 503间的会被压缩到bucket 503中,直到总的buckets数等于列中非重复值数。(如figure 4所示)dbms_stats包直接被用来创建直方图。
优化器使用频率直方图可以为promo_category_id列基数的确定提供更精确的数值。例如,对于谓语promo_category_id=10,优化器会先确定直方图中end point为10的bucket数。找到了endpoint为10的桶为bucket 503 ,然后减去上一个bucket号 bucket 483,503-483=20。基数的评估会使用以下公式来计算 : (number of bucket endpoints / total number of bucket) * NUM_ROWS , 20/503X 503 所以在表 promotions中promo_category_id = 10的数据行有20行。
未完待续。。。。。。还有以下章节。。。。明天再补。。。
Height balanced Histograms(高度均衡直方图)
Extended Statistics
Column Groups
Expression Statistics
Restrictions on Extended Statistics
Index Statistics
- 什么是优化器统计信息?----系列二
- 5 统计信息--优化主题系列
- oracle database 优化器(Optimizer statistics)统计信息一二三----系列1
- Oracle 12c数据库优化器统计信息收集的最佳实践(二)
- Oracle10g优化器统计信息自动收集
- 优化器(CBO)的统计信息
- oracle优化器统计信息相关
- 优化程序统计信息
- SQL优化:统计信息
- Oracle 管理优化器的统计信息之系统统计信息 System Statistics
- 什么是统计信息以及收集查看方法
- 在DB2优化器中使用分布统计信息
- 在 DB2 优化器中使用分布统计信息
- Mysql数据库优化系列(二)------AWK脚本统计数据库性能参数
- Mysql数据库优化系列(二)------AWK脚本统计数据库性能参数
- 数据库性能优化、统计信息与对象统计信息概述收集、扩展统计信息、dbms_stats.get_prefs
- Oracle 12c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息
- 创建统计信息来优化查询性能
- int, float, double之间不得不说的故事
- YUM [Errno 256] No more mirrors to try.解决办法
- 【phpcms-v9】前台content模块中pc标签的调用说明
- 二叉树和其他树
- extern使用方法总结!
- 什么是优化器统计信息?----系列二
- POJ 2785 4 Values whose Sum is 0 二分
- 黑马程序员--基础--第一篇--JDK5.0新特性泛型 静态倒入 自动拆装箱 不定项参数 增强for如循环 枚举
- thinking in asp 之appendix A - 吐槽JAVA:SIN OF OOP
- Android 4.0 源码目录
- 危险代码:内存中的Java类和对象为何变得不安全—Part3
- c++编译器名字查找规则之ADL和Ordinal Lookup比较
- 中国版BB-Black诞生记
- u-boot-1.1.6移植到mini2440笔记