第6章 关于Greenplum的数据库统计

来源:互联网 发布:手机怎么备份所有数据 编辑:程序博客网 时间:2024/06/05 02:49

本章是在Greenplum数据ANALYZE命令收集的统计数据的概述。

统计是描述存储在数据库中的数据的元数据。查询优化程序需要用最新的统计数据来选择查询的最佳执行计划。例如,如果查询联接两个表,其中一个必须被广播到所有段,优化器可以选择这两个表中较小的表以减少网络流量。

优化程序使用的统计计算和ANALYZE命令来保存结果到系统目录中。有三种方式开始分析操作:

•                你可以直接运行ANALYZE命令。

•                你可以在数据库外使用命令行运行analyzedb管理实用程序。

•      在表上执行的DML操作上没有统计或者一个DML操作修改行数超过指定的阈值时会触发自动分析操作。

      这些方法在下面的章节中描述。

      vacuum  ANALYZE命令是另一种方式启动一个分析操作,但不鼓励使用,因为真空和分析是具有不同用途不同的操作。

统计计算消耗的时间和资源,让Greenplum数据由大表的样本计算的统计数据产生的估计。在大多数情况下,默认设置提供生成用于查询正确执行计划所需的信息。如果生产不生产最优的查询执行计划的统计数据,管理员可以调整配置参数来增加样本量或保存在系统目录统计信息的粒度更准确stastistics。产生更准确的统计具有CPU和存储成本并且可能不会产生更好的计划,因此,以查看解释计划和测试查询性能,以确保其他统计信息相关的成本导致更好的查询性能是重要的。

系统统计

表大小

查询规划力求减少执行查询,使用必须处理的行数和查询必须访问磁盘页的数目的估计所需的磁盘I / O和网络流量。从这些估计得出的数据是pg_class系统表列reltuples和relpages,其中包含的行数和页面数在当时vacuum或ANALYZE命令最后一次运行。随着行的追加或删除,数字变得不准确。然而,磁盘页的准确计数总是可从操作系统,所以只要reltuples和relpages的比率不显著改变,优化器可以产生的行数是足够精确选择正确的估计查询执行计划。

对于附加优化表,元组的数量在系统目录中始终保持最新,所以reltuples统计不是估计。在表中不可见的元组从总减去。该relpages值从追加优化块大小估计。

当reltuples列由SELECT COUNT(*)返回的行数显著不同,分析的应进行更新统计信息。

当一个REINDEX命令完成重新索引,所述relpages和reltuples列被设置为零。在Analyze命令应在基​​表上运行来更新这些列。


The pg_statistic System Table and pg_stats View


在pg_statistic里系统表保持最后的结果分析有关每个数据库表的操作。

有对每个表的每列的行。它具有以下栏目:

starelid

表或索引的列所属对象ID。The object ID of the table or indexthe column belongs to.

staatnum

从1开始的号码,用于描述所属的列。The number of the described column,beginning with 1.

stanullfrac

这是空列的项的分数。The fraction of the column's entriesthat are null.

stawidth

平均宽度保存,以字节为单位的非空项The average stored width, in bytes, ofnon-null entries.

stadistinct

正数是在列的不同值的数目的估计值;不期望的数量与行数而变化。负值是由行数除以不同值的数目,也就是,与该列的不同值的行的比率,负的。这个形式是当不同值的数量与行数增加。唯一列,例如,有-1.0 n_distinct值。平均宽度大于1024列被认为是独一无二的。

stakindN

指示的种类存储在pg_statistic里行的第N时隙统计的代码编号。A code numberindicating the kind of statistics stored in the Nth slot of the pg_statisticrow.

staopN

操作者用于导出存储在第N个时隙中的统计信息。例如,直方图槽位会显示<操作符定义了该数据的排序顺序。An operator used to derive the statisticsstored in the Nth slot. 例如, a histogram slot would show the <operator that defines the sort order of the data.

stanumbersN

float4变量数组包含相关类型的第N个插槽,或NULL数值统计,如果插槽那种不涉及数​​值。float4 arraycontaining numerical statistics of the appropriate kind for the Nth slot, orNULL if the slot kind does not involve numerical values.

stavaluesN

如果插槽类型不存储任何数据值的相应类型的第N个插槽,或NULL列的数据值。每个数组的元素值实际上都是指定字段的数据类型,所以没有办法比anyarray的更具体定义这些列的类型。

收集一列中的统计变化为不同的数据类型,因此,pg_statistic里表存储统计数据是适合于在四个时隙中的数据类型,其中包括每时隙四个列的。例如,第一时隙,它通常包含一列最常见的值,由列stakind1, staop1, stanumbers1, 和stavalues1.。

各包含一个数字代码stakindN列来描述存储在其时隙统计的类型。从1到99的stakind代码号被保留用于PostgreSQL核心数据类型。Greenplum的数据库使用代码编号为1,2和3的值为0表示插槽未使用。下表描述了各种存储三个码统计信息。

Table 5:Contents of pg_statistic "slots"

stakind

Code

Description

1

大多数CommonValues(MCV)插槽

•staop包含“=”运算符,用于决定的值是否相同或不的对象ID。

•stavalues包含出现在列在K最常见的非空值的阵列。

•stanumbers包含stavalues数组中的值的频率(总行数的几分之一)。

的值是有序的频率递减。由于阵列是可变尺寸,K可由统计收集来选择。值必须出现一次要添加到stavalues阵列更多;独特的列没有MCV插槽。

Most CommonValues (MCV) Slot

•     staop contains the object ID of the "=" operator, used to decide whether values are the same or not.

•     stavaiues contains an array of the K most common non-null values appearing in the column.

•     stanumbers contains the frequencies (fractions of total row count) of the values in the stavaiues array.

The values are ordered in decreasing frequency. Since the arrays are variable-size, K can be chosen by the statistics collector. Values must occur more than once to be added to the stavalues array; a unique column has no MCV slot.

2

直方图插槽 - 描述标量数据的分布。

•staop是“<”算子,它描述了排序顺序的对象ID。

•stavaiues含有M(其中M>=2)划分非空列数据值到约等于人口的M-1箱非空值。第一stavaiues项是最小值和最后是最大值。

•不使用stanumbers,应该为null。

如果还提供了一种最常用的值槽,然后直方图描述除去MCV阵列中列出的值后的数据分布。 (这是在技术用语压缩直方图)。这使得一个列的一些非常普通的值的分布的更精确的表示。在只有少数不同的值的列,它是可能的MCV列表描述了整个数据群;在这种情况下,直方图减少空,应删去。

Histogram Slot - describes the distribution of scalar data.

•     staop is the object ID of the "<" operator, which describes the sort ordering.

•     stavaiues contains M (where M>=2) non-null values that divide the non-null column data values into M-1 bins of approximately equal population. The first stavaiues item is the minimum value and the last is the maximum value.

•     stanumbers is not used and should be null.

If a Most Common Values slot is also provided, then the histogram describes the data distribution after removing the values listed in the MCV array. (It is a compressed histogram in the technical parlance). This allows a more accurate representation of the distribution of a column with some very common values. In a column with only a few distinct values, it is possible that the MCV list describes the entire data population; in this case the histogram reduces to empty and should be omitted.

3

相关插槽 - 描述表元组的物理顺序之间的相关性

该列的数据值的排序。

•staop是“<”操作符的对象ID。作为与直方图,一个以上的条目理论上可以出现。

•不使用stavaiues并且应为NULL。

•stanumbers包含单个条目,数据值的序列及其实际元组位置的序列之间的相关系数。系数范围从+1至-1。

Correlation Slot - describes the correlation between the physical order of table tuples and

the ordering of data values of this column.

•     staop is the object ID of the "<" operator. As with the histogram, more than one entry could theoretically appear.

•     stavaiues is not used and should be NULL.

•     stanumbers contains a single entry, the correlation coefficient between the sequence of data values and the sequence of their actual tuple positions. The coefficient ranges from +1 to -1.

该pg_stats视图显示pg_statistic里面的一个友好格式的内容。该pg_stats视图有以下几列:

 

schemaname

The name of the schema containing the table.

tablename

The name of the table.

attname

The name of the column this row describes.

null_frac

The fraction of column entries that are null.

avg_width

The average storage width in bytes
of the column's entries, calculated as
avg(pg_column_size(column_name)).

n_distinct

正数是在列的不同值的数目的估计值;不期望的数量与行数而变化。负值是由行数除以不同值的数目,也就是,与该列的不同值的行的比率,否定。
这个形式是当不同值的数量与行数增加。唯一列,例如,有一个n_distinct值
-1.0。平均宽度大于1024列被认为是独一无二的。

most_common_vals

包含在列最常见的值的数组,或为null如果没有值似乎更常见。如果n_distinct列是-1,most_common_vals为空。数组的长度是实际不同的列值的数目或default_statistics_target配置参数的值中的较小者。值的数量可以覆盖使用ALTER TABLE table SET COLUMN column SET STATISTICS N.

most_common_freqs

含有most_common_vals数组中的值的频率的阵列。这是由行的总数除以该值的出现的次数。该阵列是相同长度的most_common_vals阵列。它为null,如果most_common_vals为null。
An array containing the frequencies of the values in the most_common_vals array. This is the number of occurrences of the value divided by the total number of rows. The array is the same length as the most_common_vals array. It is null if most_common_vals is null.

histogram_bounds

该划分列值到近似相同的大小的组的值的阵列。直方图可以仅当存在该列的最大()聚集函数来定义。在直方图基的数目是一样的most_common_vals数组大小。

 

新创建的表和索引都没有统计。您可以检查使用缺少的统计信息表

在gp_stats_missing认为,这是在gp_toolkit模式:

SELECT * fromgp_toolkit.gp_stats_missing;

 Sampling

当计算大表统计,Greenplum数据通过抽样基表创建一个较小的表。如果表是分区的,样本是从所有分区抽取。

如果估计的行中的基表的数量小于gp_statistics_sampling_threshold配置参数的值,整个基表用于计算的统计信息。

如果创建一个示例表,计算出样品中的行数,以提供一个可接受的最大相对误差。可接受的误差量与gp_analyze_relative_error系统配置参数,该参数是默认设置.25(25%)指定。这通常是足够精确生成正确的查询计划。如果分析表列没有产生良好的估计,你可以通过gp_analyze_relative_error配置参数设置为较低的值增加样本量。要注意的是这个参数设置为一个低的值会导致一个非常大的样本大小和显着提高分析的时间。

Updating Statistics

与数据库中的所有表没有参数更新的统计数据运行分析一下。这可能需要很长的时间,所以最好是有选择地分析表中的数据更改后。您还可以分析列的一个子集,在一个表中,对于连接,使用例如列WHERE子句,SORT子句,GROUP BY子句或HAVING子句。

分析一个严重臃肿表可以生成统计数据较差,如果样品中含有空白页,所以它是分析它之前,真空表臃肿很好的做法。

看到Greenplum数据参考指南运行ANALYZE命令的详细信息,SQL命令参考。

请参阅Greenplum的数据库管理工具参考运行analyzedb命令的详细信息。


Analyzing Partitioned and Append-Optimized Tables


当ANALYZE命令在分区表上运行,它分析每个叶级子分区,一次一个。您可以运行分析关于刚刚新增或更改分区中的文件,以避免在没有改变分析分区。如果表已分区,可以分析只是新的或更改分区。

在Greenplum 4.3.5推出的analyzedb命令行实用程序,自动跳过不变分区。它还可以运行并发会话,因此它可以同时分析多个分区。它默认运行五个会话,但会话的数量可以用 -p命令行选项设置为1-10。每次运行analyzedb,它会把关于追加优化表和分区表的状态信息保存在主节点的db_analyze目录下。它在下一次运行时,analyzedb比较了保存的状态的每个表的当前状态,并跳过那些不变的表或分区。堆表总是分析。

如果Pivotal查询优化器已启用,则还需要运行ANALYZE ROOTPARTITION刷新根分区统计信息。Pivotal的查询优化器需要在根级别的分区表的统计信息。传统优化器不使用这些统计信息。通过设置既优化和optimizer_analyze_root_partition系统配置参数上启用Pivotal查询优化器。当您运行分析或ANALYZE ROOTPARTITION根级别的统计数据,然后更新。运行ANALYZE ROOTPARTITION的时间是类似分析单个分区因为ANALYZE ROOTPARTITION的时间。默认情况下,analyzedb实用程序更新根分区的统计数据,但可以添加的--skip_root_stats选项留根分区统计信息为空,如果你不使用Pivotal的查询优化器。

Configuring Statistics

配置Greenplum数据统计信息收集的几个选项。

Statistics Target

统计目标是most_common_vals的大小,most_common_freqs和histogram_bounds阵列为单个列。默认情况下,目标为25。默认的目标可以通过设置服务器配置参数进行更改,目标可以使用ALTER TABLE命令的任何列进行设置。

较大的值增加做ANALYZE所需要的时间,但可以改善传统查询优化器(策划人)估计的质量。

通过设置default_statistics_target服务器配置参数设置系统缺省的统计目标为不同的值。默认值通常是足够的,你应该只提高或降低它,如果你的测试表明,查询计划与新的目标提高。例如,要提高缺省的统计目标从25到50,你可以使用gpconfig实用程序:

gpconfig -c default_statistics_target -v 50

单独的列的statististics目标可以用ALTER TABLE命令来设置。例如,某些查询可通过增加目标为某些列中,具有不规则分布特别列得到改善。您可以为永远有助于查询otpimization列设置目标为零。当目标是0,ANALYZE忽略的列。例如,下面的ALTER TABLE命令设置的统计指标在EMP表到零notes列:

ALTER TABLE emp ALTERCOLUMN notes SET STATISTICS 0;

统计指标可在范围内设置0到1000,或将其设置为-1以重新恢复到使用系统缺省的统计目标。

在父分区表设置的统计指标会影响孩子的分区。如果您对父表的某些列设置统计为0,对于同一列的统计数据设置为0,所有的孩子分区。但是,如果您以后添加或更换另一个子分区,新的子分区将使用默认的统计目标,或者在一个交流,以前的统计指标的情况。因此,如果您添加或交换子分区,你应该设置在新的子表中的统计指标。

Automatic Statistics Collection

Greenplum数据可以被设置为自动运行分析关于要么没有统计或显著特定操作时对表进行了变化的表。对于分区表,当操作在叶表直接运行时,才会触发自动统计数据收集,然后只有叶表进行了分析。

自动统计数据收集有三种模式:

•               无禁用自动统计数据收集。none disables automatic statisticscollection.

•      on_no_stats  在当如下命令create tableas select, insert, or copy执行但没有统计信息时会触发分析操作。

•      on_change在当如下命令create table as select, update, delete,insert, or copy执行并且影响的行数超过gp_autostats_on_change_threshold参数时会触发分析操作。

自动统计数据收集模式过程语言函数和函数外执行命令中发生的命令单独设置:

•      在gp_autostats_mode配置参数控制的功能外自动统计数据收集行为,并设置为默认on_no_stats。

•      在gp_autostats_mode_in_functions参数控制表操作过程语言函数中进行,设置为none默认的行为。

随着on_change模式,分析触发只有数行受影响超出阈值定义由gp_autostats_on_change_threshold配置参数。此参数的默认值是非常高的价值,2147483647,可有效禁用自动统计数据收集;你必须设置门槛较低的数值来启用它。该on_change模式可能触发可能破坏系统大的,意想不到的分析操作,所以不建议在全球范围内设置。它可以在一个会话中是有用的,例如自动分析的负荷下的表。

要禁用自动统计数据收集之外的功能,设置gp_autostats_mode参数为none:

gpconfigure -cgp_autostats_mode -v none

要启用自动统计数据收集功能中对于没有统计数据表,更改gp_autostats_mode_in_functions到on_no_stats:gpconfigure-c gp_autostats_mode_in_functions -v on_no_stats

如果你想记录自动统计数据收集作业,设置该log_autostats参数为on。

原创粉丝点击