什么是优化器统计信息?----系列二

来源:互联网 发布: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使用以下步骤来创建频率直方图:

  1. 假设oracle在表PROMOTIONSPROMO_CATEGORY_ID列上创建频率直方图。第一步根据promo_category_id排序获取promo_category_id的值。

  2. 每个promo_category_id 会被分配到自己直方图桶中。

  3. 在这个阶段,我们可以拥有超过254histogram bucket,但那些拥有相同值的桶可以压缩到那些拥有相同值,且更高的桶中。在下面的案例中,bucket 2bucket 115之间的会被压缩到bucket 115中,bucket 484bucket 503间的会被压缩到bucket 503中,直到总的buckets数等于列中非重复值数。(如figure 4所示)dbms_stats包直接被用来创建直方图。

  4. 优化器使用频率直方图可以为promo_category_id列基数的确定提供更精确的数值。例如,对于谓语promo_category_id=10,优化器会先确定直方图中end point10bucket数。找到了endpoint10的桶为bucket 503 ,然后减去上一个bucket bucket 483503-483=20。基数的评估会使用以下公式来计算  :                                                                                                                                                                                                                                             (number of bucket endpoints / total number of bucket) * NUM_ROWS ,  20/503X 503     所以在表 promotionspromo_category_id = 10的数据行有20行。

未完待续。。。。。。还有以下章节。。。。明天再补。。。

Height balanced Histograms(高度均衡直方图)

Extended Statistics

Column Groups

Expression Statistics

Restrictions on Extended Statistics

Index Statistics


2 0
原创粉丝点击