analyzedb

analyzedb

一个提供对表的递增和并发ANALYZE操作的工具。对追加优化表来说, analyzedb只在统计数据不是最新的时候才更新统计信息。

概要

analyzedb -d dbname
        { -s schema  | 
        { -t schema.table 
        [ -i col1[, col2, ...] | 
        -x col1[, col2, ...] ] } |
        { -f | --file} config-file }
        [ -l | --list ]
        [ --gen_profile_only ]   
        [ -p parallel-level ]
        [ --full ]
        [ -v | --verbose ]
        [ --debug ]
        [ -a ]
        
        analyzedb { --clean_last | --clean_all }
        analyzedb --version
        analyzedb { -? | -h | --help }

描述

analyzedb工具递增并发地更新Greenplum数据库中指定表的表数据的统计信息。

在执行ANALYZE操作时,analyzedb创建了表元数据的快照并将它 存储在Master主机的磁盘上。只有在表格被修改的情况下才执行ANALYZE操作。如果 表或者分区自从上次分区依赖没有被修改过,则analyzedb会自动跳过表或分区, 因为它已经包含了最新的统计信息。

  • 对追加优化表来说,analyzedb如果统计数据数据不是最新的,则会逐渐分析统计数据。 例如,如果表数据在表的统计数据收集之后改变了。如果没有该表的统计数据,则收集统计数据。
  • 对于堆表,统计信息总是被更新。

即使表格统计信息是新的,也可以指定--full选项来更新追加优化表的统计信息。

默认情况下,analyzedb最多创建5个并发会话来并行分析表。 对于每个会话,analyzedb发出一个ANALYZE命令到 数据库并指定不同的表名。-p选项控制最大并发会话数。

分区追加优化表

对于一个分区的追加优化表analyzedb检查分区表的根分区和叶子分区。 如果需要,该工具将更新非当前分区和根分区的统计信息。

GPORCA需要根分区统计信息。默认情况下,如果统计信息不存在,那么analyzedb 工具将收集分区表的根分区的统计信息。如果任何叶子节点有陈旧的统计信息,那么,analyzedb 也会刷新根分区的统计信息。刷新根节点的统计信息的成本和分析一个叶子分区相当。用户可以指定 --skip_root_stats来禁用分区表的根分区的统计信息的收集。

注意

如果表已经由DML或DDL命令(包括INSERT, DELETE, UPDATE, CREATE TABLE, ALTER TABLETRUNCATE)修改,则analyzedb工具会更新追加优化表的统计信息。 该工具通过比较表的元数据和之前analyzedb操作中所保存的快照目录元数据来确定表是否已经被修改。表元数据的快照 作为状态文件存储在Greenplum数据库主数据目录中的db_analyze/<db_name>/<timestamp> 目录中。

该工具不会自动删除旧的快照信息。时间久了,这些快照会占用大量的磁盘空间。为了回收磁盘空间,您可以 保留最近的快照信息,将旧的快照删掉。 用户可以指定--clean_last或者--clean_all选项来删除由 analyzedb生成的状态文件。

如果用户未指定表,一组表或模式,那么analyzedb工具会根据需要收集所有系统 目录表和用户定义的表中的统计信息。

外部表不受analyzedb的影响。

包含空格的表名是不支持的。

在表上运行ANALYZE命令,(不使用analyzedb工具),不会更新表的元数据, analyzedb工具通常使用这些元数据通常来确定表的统计信息是否是最新的表的元数据。

选项

--clean_last
删除由上一次analyzedb操作生成的状态文件。所有的其他选项, 除了-d都会被忽略。
--clean_all
删除由analyzedb生成的所有状态文件。 所有其他操作除了-d都会被忽略。
-d dbname
指定包含要分析的表的数据库的名称。如果未指定此选项,则从环境变量PGDATABASE 中读取数据库名称。如果未设置PGDATABASE,则使用连接指定的用户名。
--debug
如果指定,则将日志级别设置为调试。在执行命令期间,调试级别信息被写入日志文件和命令行。 这些信息包括公用程序执行的命令和每个ANALYZE操作的持续时间。
-f config-file | --file config-file
包含要分析的表的列表的文本文件。可以指定当前目录的相对文件路径。
该文件每行列出一个表。表名必须使用模式名称进行限定。或者,可以使用-i-x来指定列名。文件中国不允许其他选项。其他诸如--full 的选项必须在命令行中指定。
只有一个选项可用于指定要分析的文件:-f--file, -t ,或 -s
当在多个表上执行ANALYZE操作时候,analyzedb 会创建并行会话来并行分析表。该-p选项控制并发会话的最大数目。
在下面的示例中,第一行施加了一个ANALYZE操作对表public.nation, 第二行仅对public.lineitem表的l_shipdatel_receiptdate列施加了一个ANALYZE操作。
public.nation
              public.lineitem -i l_shipdate, l_receiptdate 
--full
对所有指定的表执行ANALYZE操作。即使统计数据是最新的,也会执行该操作。
--gen_profile_only
不执行ANALYZE操作,但是更新analyzedb收集的表统计信息快照。 如果有其他选项制定了表或者模式名,该工具仅更新指定表的快照信息。
如果ANALYZE命令在数据库表上运行并且您想更新analyzedb该表 的快照信息,请指定该选项。
-i col1, col2, ...
可选的,必须用-t选项指定。对于使用-t选项指定的表, 仅收集指定列的统计信息。
只能指定-i, 或-x。这两个选项不能同时指定。
-l | --list
列出将用指定选项进行分析的表格。ANALYZE操作不执行。
-p parallel-level
并行分析的表的数量。并行级别可以是1到10之间的整数,包含首尾值。默认值是5.
-s schema
指定要分析的模式。模式中的所有表将被分析。只能在命令行中指定一个模式名称。
只有一个选项可用于指定要分析的文件:-f--file, -t,或 -s
-t schema.table
只收集schema.table的统计信息。 表名称必须使用模式名称进行限定。在命令行上只能指定一个表名。用户可以指定-f 选项来指定文件中的多个表,或者指定-s选项来指定模式中的所有表。
只有其中一个选项可用于指定要分析的文件:-f--file, -t,或 -s
-x col1, col2, ...
可选的,必须用-t选项来指定。对于使用-t选项指定的表, 请排除指定列上的收集的统计信息。统计信息只收集在未列出的列上。
只能指定-i, 或-x。这两个选项不能同时指定。
-a
静默模式,不提示用户确认。
-h | -? | --help
展示在线帮助。
-v | --verbose
如果指定,则将日志记录级别设置为verbose,以在命令执行过程中向日志文件和命令行写入附加信息。 这些信息包括所有要分析的表的列表(包括分区表的子叶子分区)。输出还包括每个ANALYZE 操作操作的持续时间。
--version
显示此工具的版本。

示例

仅收集一组表格列的统计信息的示例。在数据库mytest中,收集表 public.orders上的shipdatereceiptdate 列的统计信息:

analyzedb -d mytest -t public.orders -i shipdate, receiptdate

一个在表上收集统计信息并排除一组列的示例。在数据库mytest中,收集表public.foo 的统计数据,并且不收集bartest2列的统计信息。

analyzedb -d mytest -t public.foo -x bar, test2

指定包含表列表的文件的示例。此命令收集名为mytest的数据库中文件 analyze-tables列出的表的统计信息。

analyzedb -d mytest -f analyze-tables

如果用户未指定表,一组表或模式,则analyzedb实用程序会根据需要收集所有目录表 和用户定义的表上的统计信息。此命令刷新数据库mytest中的系统目录表和用户定义的表上 的表统计信息。

analyzedb -d mytest
用户可以创建一个PL/Python函数来运行analyzedb程序作为Greenplum的数据库函数。 这个例子CREATE FUNCTION命令创建一个用户定义的PL/ Python函数,运行 analyzedb工具并在命令行上显示输出。指定analyzedb选项作为函数参数。
CREATE OR REPLACE FUNCTION analyzedb(params TEXT)
          RETURNS VOID AS
          $BODY$
          import subprocess
          cmd = ['analyzedb', '-a' ] + params.split()
          p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
          
          # verbose output of process
          for line in iter(p.stdout.readline, ''):
          plpy.info(line);
          
          p.wait()
          $BODY$
          LANGUAGE plpythonu VOLATILE;

当这个SELECT命令由gpadmin用户运行时,该analyzedb工具对 数据库mytest中的public.mytable表执行一个分析操作。

SELECT analyzedb('-d mytest -t public.mytable') ;
Note: 注意:要创建一个PL/Python函数,该PL/Python程序语言必须在数据库中注册。例如,以管理员运行的 CREATE LANGUAGE命令将吧PL/Python注册成不受信任的语言:
CREATE LANGUAGE plpythonu;

另见

ANALYZE