时间:2021-07-01 10:21:17 帮助过:72人阅读
什么是优化器统计信息?----系列二 优化器统计信息是一堆描述数据库及数据库中对象特征的数据,优化用这些统计信息来为每个sql语句选择最优的执行计划。统计信息存储在数据字典中,可以通过user_tab_statistics数据库字典视图获取,优化器统计信息和那些通过
优化器统计信息是一堆描述数据库及数据库中对象特征的数据,优化用这些统计信息来为每个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