analyzedb

analyzedb

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

概要

analyzedb -d dbname
   { -s schema  | 
   { -t schema.table 
     [ -i col1[, col2, ...] | 
       -x col1[, col2, ...] ] } |
     { -f | --file} config-file }
   [ -l | --list ]
   [ -p parallel-level ]
   [ --full ]
   [ --skip_root_stats ]
   [ -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 TABLE and TRUNCATE)修改,则 analyzedb 工具会更新追加优化表的统计信息。该工具通过比较表的和之前analyzedb操作中所拍的快照目录元数据来确定表是否已经被修改。表元数据的快照作为状态文件存储在Greenplum数据库主数据目录中的 db_analyze 目录中。用户可以指定 --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 操作。即使统计数据是最新的,也会执行该操作。
-i col1, col2, ...
可选的,必须用 -t 选项指定。对于使用 -t 选项指定的表,仅收集指定列的统计信息。
只能指定 -i, 或 -x。这两个选项都不能指定。
-l | --list
列出将用指定选项分析的表格。该 ANALYZE 操作不执行。
-p parallel-level
并行分析的表的数量。 并行级别 可以使1到10之间的整数。默认值是5.
--skip_root_stats

如果任何还被分析的叶分区需要更新,则跳过刷新的根分区统计信息。

如果用户使用GPORCA对分区表执行查询(默认),则不要指定此选项。

-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') ;
注意: 要创建一个 PL/Python 函数,该 PL/Python 程序语言必须在数据库中注册。例如,该以管理员运行的 CREATE LANGUAGE 命令将吧PL/Python注册成不收信任的语言:
CREATE LANGUAGE plpythonu;

另见

ANALYZE