Greenplum中的统计信息

0    120    2

Tags:

👉 本文共约16260个字,系统预计阅读时间或需62分钟。

关于Greenplum数据库中的数据库统计信息

Greenplum数据库中通过ANALYZE命令收集的统计信息的概述。

统计信息是描述数据库中数据的元数据。 查询优化器需要最新的统计信息以便为查询选择最好的执行计划。 例如,如果一个查询连接两个表并且其中的一个必须被广播到所有的Segment,优化器可以选择两个表中较小的那一个来最小化网络流量。

优化器使用的统计信息由ANALYZE命令计算并且保存在系统目录中。

GP统计信息分析有三种方式

  • 用户可以直接运行ANALYZE命令。
  • 用户可以在数据库外部从命令行运行analyzedb管理工具。
  • 当在没有统计信息的表上执行DML操作或者一个DML操作修改的行数超过指定阈值时,会触发一次自动的分析操作。

这些方法会在下面的小节中描述。VACUUM ANALYZE命令是另一种启动分析操作的方式,但是不鼓励使用它,因为清理和分析是两种不同目的的不同操作。

计算统计信息需要消耗时间和资源,因此Greenplum数据库通过在大型表的采样上计算统计信息来得到估计值。 在大部分情况下,默认的设置提供了足以为查询生成正确执行计划的信息。 如果产生的统计信息没有产生最优的查询执行计划,管理员可以调节配置参数通过提高样本尺寸或者系统目录中保存的统计信息粒度来产生更准确的统计信息。 产生更准确的统计信息需要CPU和存储代价并且不一定能产生更好的计划,因此重点是查看解释计划并且测试查询性能来确保额外的统计信息代价能导致更好的查询性能。

下面列出分析统计信息相关的命令:

系统统计信息

表尺寸

查询规划器想要最小化执行查询所需的磁盘I/O和网络流量,它会使用必须被处理的行数以及查询必须访问的磁盘页面数的估计值。 用于生成这些估计值的数据是pg_class系统表列reltuples和relpages,它们分别包含上一次VACUUM或ANALYZE命令运行时的行数和页面数。 随着行被增加或删除,这些数字变得越来越不准确。 不过,总是可以从操作系统拿到准确的磁盘页面计数,因此只要reltuples与relpages的比例不发生显著变化,优化器就能够产生对选择正确的查询执行计划足够准确的行数估计。

*当reltuples列与SELECT COUNT()返回的行计数显著不同时,应该执行一次分析来更新统计信息。**

当一个REINDEX命令完成了重建一个索引时,relpages和reltuples列被设置为零。应该在基表上运行ANALYZE命令以更新这些列。

pg_statistic系统表和pg_stats视图

pg_statistic系统表保持在每个数据库表上最后一次ANALYZE操作的结果。其中为每一个表的每一列都有一行。行有下面的列:

starelid

该列所属的表或索引的对象ID。

staattnum

所描述列的编号,从1开始。

stainherit

如果值是true,统计信息不仅包括指定的relation,还包括继承的子列。

stanullfrac

列中为空的项的分数值。

stawidth

非空项的平均存储宽度,单位是字节。

stadistinct

一个正数,它是列中可区分值的数量估计。这个数字预计并不会随着行数变化。 一个负值是可区分值数量除以行数,也就是该列中有可区分值的行的比例取负值。 当可区分值数量随行数增加时使用这种形式。例如,一个唯一列的n_distinct值为-1.0。 平均宽度超过1024的列被认为是唯一的。

stakindN

一个代码数字,它表示存储在pg_statistic行第N个槽中的统计信息类型。

staopN

用来得到第N个槽中统计信息的操作符。例如,一个直方图槽会显示 < 操作符,它定义数据的排序顺序。

stanumbersN

float4数组,包含第N个槽的合适类型的数字统计信息,如果槽类型不涉及数字值则为NULL。

stavaluesN

第N个槽的合适类型的列数据值,如果该槽类型不存储任何数据值则为NULL。 每一个数组的元素值实际是指定列的数据类型,因此没有办法比使用anyarray更具体地定义这些列的类型。

为一个列收集的统计信息随着不同数据类型变化,因此pg_statistic表中存储适合于四个槽中数据类型的统计信息,每个槽由四个列组成。 例如,第一个槽通常包含一列的最常见值,它由列stakind1、staop1、stanumbers1和stavalues1组成。

stakindN列每个都包含一个数字代码,用于描述存储在其插槽中的统计信息的类型。 从1到99的stakind代码编号保留给核心PostgreSQL数据类型。 Greenplum数据库使用代码编号 1,2,3,4,5,和99。0的意思是槽未使用。 下面的表格描述了为三种代码存储的统计信息类型。

stakind代码描述
1最常见值(MCV)槽staop包含”=”操作符的对象ID,它被用来决定值是否相同。stavalues包含一个数组,其中是该列中出现的K个最常见非空值。stanumbers包含stavalues数组中值的频度(总行数的分数)。值按照频度降序排序。因为数组是可变尺寸的,K可以由统计收集器选择。 要被加入到stavalues数组中,值必须出现超过一次。唯一列没有MCV槽。
2直方图槽 – 描述标量数据的分布。staop是”<”操作符的对象ID,它描述排序顺序。stavalues包含M(其中M>=2)个非空值,它们将非空的列数据值划分成M-1个群体数量大致相等的箱子。第一个stavalues项是最小值而最后最后一个是最大值。stanumbers没有被使用且应该为NULL。如果也提供了一个最常见值的槽,那么该直方图描述的是将MCV数组中列出的值移除后的数据分布(在技术上的说法是一个压缩直方图)。 这允许更精确地表示一个有一些非常常见值的列的分布。 在一个只有一些可区分值的列中,有可能MCV列表就描述了整个数据群体,在这种情况下直方图缩小为空并且应该被省略。
3相关关系槽 – 描述表元组物理顺序和列数据值顺序之间的相关关系。staop是”<”操作符的对象ID。与直方图一样,理论上可能会出现多于一项。stavalues未被使用并且应该为空。stanumbers包含一个单项,它是数据值的序列和它们实际元组位置序列之间的相关系数。系数范围从+1到-1。
4最常见的元素插槽 - 类似于最常见值(MCV)插槽,除了它存储列值的最常见非空元素。 当列数据类型是数组或具有可识别元素的其他类型(例如,tsvector)时,这非常有用。staop包含适合于元素类型的相等运算符。stavalues包含最常见的元素值。stanumbers包含共同的元素频率。频率测量为元素值出现的非空行的分数,而不是所有行的频率。 此外,值将按元素类型的默认顺序排序(以支持特定值的二分查找)。 由于这会将最小和最大频率放在不稳定点上,因此有两个额外的stanumbers成员可以保存最小和最大频率的副本。 可选地,可以存在保持空元素的频率的第三额外成员(频率以相同的术语表示:包含至少一个空元素的非空行的分数)。 如果省略此成员,则假定该列不包含NULL元素。Note: 注意:对于tsvector列,stavalues元素的类型为text,即使它们在tsvector中的表示不完全是文本。
5不同的元素计数直方图槽 - 描述了数组类型列的每一行中存在的不同元素值的数量的分布。 仅考虑非空行,并且仅考虑非空元素。staop包含适合于元素类型的相等运算符。stavalues未使用且应为NULL。stanumbers包含有关不同元素的信息。 stanumbers的最后一个成员是所有非空行上的不同元素值的平均计数。 前面的M(其中M> = 2)成员形成直方图,该直方图将不同元素计数的群体划分为大致相等群体的M-1个区间。 第一个是观察到的最小计数,最后一个是最大值。
99超级日志槽 - 对于分区表的子叶分区,存储为采样数据创建的超级日志计数器。 hyperloglog_counter数据结构转换为bytea并存储在pg_statistic目录表的stavalues5插槽中。

pg_stats视图以一种友好的格式表示pg_statistic的内容。pg_stats视图有下列列:

schemaname

包含该表的方案名称。

tablename

该表的名称。

attname

这行所描述的列名。

inherited

如果为true,统计信息包含继承的子列。

null_frac

为空的列项所占的比例。

avg_width

该列中项的平均存储宽度(以字节为单位),计算方法是avg(pg_column_size(column_name))。

n_distinct

一个正数是该列中可区分值的数量估计。这个数字预计并不会随着行数变化。 一个负值是可区分值数量除以行数,也就是该列中有可区分值的行的比例取负值。 当可区分值数量随行数增加时使用这种形式。例如,一个唯一列的n_distinct值为-1.0。 平均宽度超过1024的列被认为是唯一的。

most_common_vals

包含该列中最常见值的数组,如果没有值看起来更常见则为空。 如果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数组的长度相等。如果most_common_vals为空,则它也为空。

histogram_bounds

一个值数组,它把列值划分成大约相同尺寸的分组。只有对该列有一个max()聚集函数时才能定义直方图。 直方图中分组的数量等于most_common_vals数组的尺寸。

correlation

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
Greenplum中的统计信息后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部