天天看点

第二章 SQL命令参考-ANALYZE

ANALYZE

Collectsstatistics about a database.

概要

ANALYZE [VERBOSE][ROOTPARTITION [ALL]]

[table[(column [,...])]]

描述

分析有关的表的数据库中的系统表pg_statistic里的内容,并存储该结果收集统计信息。随后,Greenplum数据引擎使用这些数据来帮助判断查询的最有效的执行计划。

如果没有参数,ANALYZE收集的统计数据在当前数据库中每个表。您可以指定表名,以收集单个表的统计信息。你可以指定_组列名,在这种情况下,只有那些列收集统计信息。

ANALYZE不收集外部表的统计信息。

重要提示:如果您打算启用了举足轻重的查询优化器对分区表执行查询时,必须收集有关分区表的根分区用analyze命令ROOTPARTITION统计。有关匹查询优化器的信息,请参阅“查询数据”\ n中的Greenplum数据管理员指南。

注意:您还可以使用Greenplum的数据库实用程序analyzedb更新表统计信息。

该analyzedb实用程序可以更新同时在多个表的统计信息。该实用程序还可以检查表的统计信息和统计数据的更新仅在统计信息不及时或不存在。有关工具的信息,请参阅Greenplum的数据库实用程序指南。

参数

ANALYZE ROOTPARTITIONALL;

只有在分区表的根分区收集统计信息。当你指定ROOTPARTITION,您必须指定全部或分区表的名称。

如果你用所有指定ROOTPARTITION,Greenplum数据收集在数据库中的所有分区表的根分区统计信息。如果在数据库中没有分区表,_条消息,指出有没有返回分区表。对于未分区表的表,统计信息没有收集。

如果指定带ROOTPARTITION_个表名和表不是分区表,不统计信息收集表,并返回_个警告消息。

该ROOTPARTITION条款不符合VACUUMANALYZE有效。该命令VACUUM ANALYZE ROOTPARTITION返回_个错误。

刷新根级统计的成本可比分析_叶分区。

对于分区表sales_curr_yr,这个例子命令只收集对分区表的根分区统计信息。ANALYZE ROOTPARTITION sales_curr_yr;

这个例子分析有关数据库中所有的分区表的根分区命令收集统计信息。

ANALYZE ROOTPARTITION ALL;

VERBOSE

启用进度消息的显示。启用进度消息的显示。ANALYZE发出此信息The table that isbeing processed.

•     正在执行生成示例表的查询

•     正在为其计算统计数据的列。

•     颁发给收集不同的统计单个列的查询。

•     生成的统计信息。

table

Thename (possibly schema-qualified) of a specific table to analyze. Defaults toall tables in the current database.

column

Thename of a specific column to analyze. Defaults to all columns.

Notes

定期运行,或者在表中的内容发生重大变化后仅对该表执行是_个很好的选择。准确的统计数据有助于Greenplum数据引擎选择最合适的查询计划,从而提高查询处理的速度。通常的策略时再每天闲时执行vacuum 和 analyze. ANALYZE需要在目标表SHARE UPDATE EXCLUSIVE锁。这与这些锁锁冲突:

SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE。对于分区表,指定表的_部分来分析,如果分区表有大量的进行了分析,只有少数叶子表已经改变分区的根分区或子(叶子表)是有用的。

•     当您运行分析关于根分区表,收集统计信息对所有叶子表(由分区表使用由Greenplum数据引擎创建的子表的层次结构中的最低级别的表)。

当您运行分析关于叶子表,统计数据只对叶子表收集。当您运行分析关于子表是不是叶子表,统计信息没有收集。

例如,您可以创建与2000年至2010年和子分区为每年每个月分区的分区表。如果您运行的子表分析2005年的统计数字收集。如果您运行分析关于为2005年3月的叶子表,统计数据为叶子表只收取。

Note: 当您使用CREATETABLE命令的分区表,Greenplum的数据库中创建您指定的表(root分区或父表),并创建基于您指定的分区层级(子表)表的层次结构。分区表,子表及其继承关系的水平在系统视图PG_分区跟踪。

•     对于包含已交换使用外部表树叶子分区的分区表,ANALYZE不收集外部表的分区统计:

•     如果ANALYZE[ROOTPARTITION]运行,外部表分区,不分析和根表的统计数据不包括外部表分区。

•     如果ANALYZE是在外部表分区上运行,该分区没有分析。

如果指定了VERBOSE子句,则显示如下消息:跳过外部表。

通过分析所收集的统计数据通常包括_些在每_列中与表示在每列的近似数据分布的直方图的最常见的值的列表。如果ANALYZE认为他们不感兴趣(例如,在_个独特的键列,没有共同的值),或者如果该列数据类型不支持相应的运营商的_个或两个的这些可被省略。

对于大表,ANALYZE采集表内容的_个随机抽样,而不是检查每_行。这使得即使非常大的表中的少量时间进行分析。但是请注意,该统计数据仅近似的,并且每次都将略有改变ANALYZE运行时,即使实际的表的内容没有改变。这可能会导致EXPLAIN显示的规划器的估计小的变化。在极少数情况下,这个不确定的行为会导致查询优化器选择分析运行之间不同的查询计划。为了避免这种情况,通过用调整default_statistics_target配置参数提高统计数据情况分析所收集的金额,或在列逐列的基础设置与ALTER TABLE每列的统计目标...ALTER COLUMN ... SET统计(见ALTERTABLE)。目标值设定在最常见值列表中的条目的最大数目和在柱状图箱的最大数量。默认目标值为10,但这是可以上下调整权衡对采取的时间规划器的估计的准确性分析和空间中pg_statistic里所占的量。特别是,统计目标设置为零就关闭了该字段的统计收集。这可能是做这对于那些从未使用过的WHERE,GROUPBY或ORDER BY查询的WHERE子句的_部分列有用的,因为规划将有没有用这样的字段上的统计数据。

被分析的列中的最大的统计目标确定取样以准备统计信息表格中的行数。增加目标会导致做ANALYZE所需要的时间和空间成比例增加。

当Greenplum数据引擎执行ANALYZE操作来收集表统计和检测,所有抽样表数据页是空的(不包含有效数据),Greenplum数据显示应该进行VACUUMFULL操作的消息。如果采样的页面都是空的,表的统计信息不准确。页面的大量更改表中的后变成空的,例如删除大量的行。真空FULL操作删除了空白页,并允许ANALYZE操作以收集准确的统计数据。

示例

Collect statistics forthe table mytable:

ANALYZE mytable;

兼容性

There is no analyze statement in the SQLstandard.

相关参考

alter table, explain, vacuum,analyzedb utilityin the Greenplum Database Utility Guide.

继续阅读