Home >Database >Mysql Tutorial >什么是优化器统计信息?----系列二

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

WBOY
WBOYOriginal
2016-06-07 15:28:051220browse

什么是优化器统计信息?----系列二 优化器统计信息是一堆描述数据库及数据库中对象特征的数据,优化用这些统计信息来为每个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使用以下步骤来创建频率直方图:

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

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

    \

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

    \

  4. 优化器使用频率直方图可以为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

    
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn