RUNSTATS 命令

RUNSTATS 命令更新系统目录中有关表、关联索引或统计视图的特征的统计信息。 这些特征包括记录数、页数和平均记录长度。 优化器使用这些统计信息来确定数据的访问路径。

对于表,在表具有许多更新时或重组表之后调用 RUNSTATS 命令。 对于统计视图,如果对底层表的更改很大程度地影响了视图返回的行时,请调用 RUNSTATS 命令。 必须预先启用视图才能通过使用 ALTER VIEW 语句在查询优化中使用。

作用域

您可以从 db2nodes.cfg 文件中的任何数据库分区发出 RUNSTATS 命令。 可以使用该命令来更新目录数据库分区上的目录。

对于表,此命令收集从中调用表的数据库分区上的表的统计信息。 如果此表在该数据库分区上不存在,那么会选择数据库分区组中的第一个数据库分区。

对于视图,此命令通过使用来自所有参与数据库分区的表中的数据来收集统计信息。

权限

对于表,您需要以下其中一个权限:
  • SYSADM
  • SYSCTRL
  • SYSMAINT
  • DBADM
  • SQLADM
  • 对表的 CONTROL 特权
  • LOAD 权限

您不需要任何显式特权以在其连接中存在的任何已声明临时表上使用此命令。

对于统计视图,请具有下列权限之一:
  • SYSADM
  • SYSCTRL
  • SYSMAINT
  • DBADM
  • SQLADM
  • 对统计视图的 CONTROL 特权
  • LOAD 权限

需要的连接

数据库

命令语法

Read syntax diagramSkip visual syntax diagramRUNSTATS ON TABLEVIEW object-nameUSE PROFILEUNSET PROFILEStatistics OptionsUTIL_IMPACT_PRIORITYpriority
Statistics Options
Read syntax diagramSkip visual syntax diagramTable Object OptionsALLOW WRITE ACCESSALLOW READ ACCESSTable Sampling OptionsIndex Sampling OptionsProfile Options
Table Object Options
Read syntax diagramSkip visual syntax diagramFORIndex ClauseEXCLUDING XML COLUMNSColumn Stats ClauseEXCLUDING XML COLUMNSANDIndex Clause
Table Sampling Options
Read syntax diagramSkip visual syntax diagramTABLESAMPLEBERNOULLISYSTEM(numeric-literal)REPEATABLE(integer-literal)
Index Sampling Options
Read syntax diagramSkip visual syntax diagramINDEXSAMPLEBERNOULLISYSTEM(numeric-literal)
Profile Options
Read syntax diagramSkip visual syntax diagramSET PROFILE NONESETUPDATEPROFILEONLY
Index Clause
Read syntax diagramSkip visual syntax diagramSAMPLEDUNSAMPLEDDETAILEDINDEXESINDEX,index-nameALL
Column Stats Clause
Read syntax diagramSkip visual syntax diagramOn Cols ClauseOn Cols ClauseDistribution Clause
On Cols Clause
Read syntax diagramSkip visual syntax diagramON ALL COLUMNSONALLKEYCOLUMNS ANDCOLUMNS(,Column Option)ON KEY COLUMNS
Distribution Clause
Read syntax diagramSkip visual syntax diagramWITH DISTRIBUTIONOn Dist Cols ClauseDefault Dist Options
On Dist Cols Clause
Read syntax diagramSkip visual syntax diagramON ALL COLUMNSONALLKEYCOLUMNS ANDCOLUMNS(,Column OptionFrequency OptionQuantile Option)ON KEY COLUMNS
Default Dist Option
Read syntax diagramSkip visual syntax diagramDEFAULTFrequency OptionQuantile Option
Frequency Option
Read syntax diagramSkip visual syntax diagramNUM_FREQVALUESinteger
Quantile Option
Read syntax diagramSkip visual syntax diagramNUM_QUANTILESinteger
Column Option
Read syntax diagramSkip visual syntax diagramcolumn-nameLIKE STATISTICS(,column-name)

命令参数

object-name
标识要在其上面收集统计信息的表或统计视图。 此参数不能是表层次结构。 对于类型表,object-name 参数的值必须是表层次结构的根表的名称。 必须使用格式为 schema.object-name 的标准名称或别名。 模式是创建表的用户名。
USE PROFILE
此选项允许 RUNSTATS 使用先前存储的统计信息概要文件来收集表或统计视图的统计信息。 统计信息概要文件是使用 SET PROFILE 选项创建的,并使用 UPDATE PROFILE 选项进行更新。
UNSET PROFILE
移除统计信息概要文件。 例如,以下命令移除 tablemyschema.mytable 表的概要文件:
RUNSTATS ON tablemyschema.mytable UNSET PROFILE
FOR INDEXES
仅收集和更新索引的统计信息。 如果先前未在表上收集表统计信息,那么还将收集基本表统计信息。 更新表基数 (CARD)、FPAGES 和 NPAGES 的统计信息,即使表统计信息存在时也是如此。 这些基本统计信息不包括任何分布统计。 此选项不能用于视图。 也可能更新索引的前导列的 COLCARD。
SAMPLED
仅与 DETAILED 参数一起使用。 指定此选项不会更改 DETAILED 的缺省功能。 为了与先前版本的 Db2®兼容,将保留 SAMPLED 参数。 此参数不能用于视图。
UNSAMPLED
此选项与 DETAILED 选项配合使用时,强制使用 RUNSTATS 来检查索引中的每个条目以计算扩展的索引统计信息。 不能将 UNSAMPLED 参数用于视图,并且它不能与扫描索引采样(INDEXSAMPLE 关键字)一起使用。 此选项显着增加了 RUNSTATS 资源消耗,而很少提供与 DETAILEDSAMPLED DETAILED 选项等效的显着改进。
DETAILED
计算扩展的索引统计信息。 扩展的索引统计信息是针对相对较大的索引收集的 CLUSTERFACTORPAGE_FETCH_PAIRS 统计信息。 不会检查所有索引条目。 采用 CPU 采样技术来提高性能。 不能将此参数用于视图。
index-name
标识在表上定义的现有索引。 如果未指定格式为 schema.index-name 的标准名称,那么将使用缺省模式。
EXCLUDING XML COLUMNS
从统计信息收集中省略所有 XML 类型列。 使用此子句有助于收集非 XML 列的统计信息,因为包含 XML 数据可能需要更多系统资源。 EXCLUDING XML COLUMNS 子句优先于为统计信息收集指定 XML 列的其他子句。 例如,如果使用 EXCLUDING XML COLUMNS 子句,并且还使用 ON COLUMNS 子句指定 XML 类型列,或者使用 ON ALL COLUMNS 子句,那么在统计信息收集期间将忽略所有 XML 类型列。 对于 Db2 V9.7 修订包 1 和更高发行版,当您指定此参数时,不会收集基于 XML 类型列的分布统计信息。
AND INDEXES
收集和更新表与索引的统计信息。
ON ALL COLUMNS
收集所有合格列的统计信息。 可以将此参数与 On Cols 子句配合使用,也可以将此参数与 WITH DISTRIBUTION 参数之后的 On Dist Cols 子句配合使用。 如果没有指定任何一个特定于列的子句,那么 ON ALL COLUMNS 参数是缺省值。

如果在 On Cols 子句中指定了该值,那么除非选择特定列作为 WITH DISTRIBUTION 子句的一部分,否则所有列仅收集基本列统计信息。 作为 WITH DISTRIBUTION 子句的一部分指定的那些列还将收集基本统计信息和分布统计信息。

如果指定了 WITH DISTRIBUTION ON ALL COLUMNS ,那么将为所有符合条件的列收集基本统计信息和分布统计信息。 因此,该子句中指定的任何内容都是冗余的,而不是On Cols 必需的。

ON COLUMNS
要收集有关特定列和/或列组的统计信息,请使用 ON COLUMNS。 列组是要收集组合统计信息的列的带圆括号的逗号分隔列表。

列和列组指定为带圆括号的逗号分隔列表。

在不收集索引统计信息,但指定要收集统计信息的列子集的情况下,在表上运行 RUNSTATS 命令具有以下效果:
  • 不会为您未对 RUNSTATS 命令指定但是索引中第一列的列重置统计信息。
  • 对于未对 RUNSTATS 命令指定的所有其他列,将重置统计信息。

可以在 On Cols 子句和 On Dist Cols 子句中使用 ON COLUMNS 参数。 当前不支持收集一组列的分布统计信息。

如果在列组中指定 XML 类型列,那么将忽略 XML 类型列以收集组的不同值。 但是,将为列组中的 XML 类型列收集基本 XML 列统计信息。

ON KEY COLUMNS
收集有关组成表中定义的所有索引的列的统计信息。 假定查询中的关键列也是用于对表创建索引的那些列。 如果表上没有索引存在,那么不会收集列统计信息。

可以在 On Cols 子句或 On Dist Cols 子句中使用 ON KEY COLUMNS 参数。 在这两个子句中指定参数是多余操作,因为如果指定 On Dist Cols 子句(在 WITH DISTRIBUTION 参数之后),那么将收集基本和分布统计信息。

根据定义, XML 类型的列不是键列,并且不包含在 ON KEY COLUMNS 参数的统计信息收集中。 不能将此参数用于视图。

column-name
表或统计视图中列的名称。 如果指定统计信息集合的不合格列的名称,例如不存在的列或拼错的列名,那么返回错误 (-205)。 可以指定两列列表,一个不带分发,另一个带分发。 如果在列表中指定了未与 WITH DISTRIBUTION 子句关联的列,那么将仅收集基本列统计信息。 如果列同时出现在这两个列表中,那么将收集分布统计信息(除非 NUM_FREQVALUESNUM_QUANTILES 设置为零)。
LIKE STATISTICS
使用单字节字符集 (SBCS)、FOR BIT DATA 或 UTF-8 的代码页属性收集类型为 BINARY、VARBINARY、CHAR 或 VARCHAR 的列的其他列统计信息。 如果 runstats 实用程序在分析列值后确定这些统计信息是适当的,那么将收集这些统计信息。这些统计信息显示在 SYSSTAT.COLUMNS 视图中的 SUB_COUNT 和 SUB_DELIM_LENGTH 列中。 查询优化器使用这些统计信息来提高类型为 "column LIKE '%xyz'""column LIKE '%xyz%'" 的谓词的选择性估计。
WITH DISTRIBUTION
收集列的基本统计信息和分布统计信息。 如果未指定 ON COLUMNS 参数,那么将在表或统计视图的所有列上收集分布统计信息,不包括不合格的列,例如类型为 CLOB 和 LONG VARCHAR 的列。 如果指定 ON COLUMNS 参数,那么仅在您提供的列列表上收集分布统计信息,不包括那些不符合统计信息收集条件的列。

如果指定 WITH DISTRIBUTION 参数后跟带有列组的 ON COLUMNS 参数,那么不会为列组收集分布统计信息。

DEFAULT
如果指定 NUM_FREQVALUESNUM_QUANTILES 参数,那么参数的值将用于确定要为列收集的频率和分位数统计信息的最大数量。 如果未在 ON COLUMNS 子句中指定个别列的值,那么将使用 NUM_FREQVALUESNUM_QUANTILES 参数。 如果未指定 DEFAULT 参数,那么使用的值是相应的数据库配置参数中的值。
NUM_FREQVALUES
定义引用频率统计信息的 DEFAULT 参数。 您可以在 ON COLUMNS 参数之后为个别列指定此参数。 如果改为在 DEFAULT 参数后指定 NUM_FREQVALUES 参数,那么将使用 DEFAULT 参数后的 NUM_FREQVALUES 参数的值。 如果指定的值为 '-1' ,或者未在 ON COLUMNSDEFAULT 参数后指定 NUM_FREQVALUES 参数,那么最大频率值数为 num_freqvalues 数据库配置参数的值。
NUM_QUANTILES
定义要收集的分发分位数值的最大数。 可以为 ON COLUMNS 子句中的单个列指定它。 如果未指定该值,或者将该值指定为单个列的 '-1' ,那么将从 DEFAULT 子句中指定的值中选取分位数限制值。 如果未指定此参数,那么要收集的最大分位数值数是在 num_quantiles 数据库配置参数中设置的值。

对于 Db2 V9.7 修订包 1 及更高发行版,基于 XML 数据的每个索引的分布统计信息使用最多 250 个分位数作为缺省值。 可以通过在 ON COLUMNSDEFAULT 子句中指定 NUM_QUANTILES 参数来更改缺省值。 在收集 XML 分布统计信息时,将忽略 num_quantiles 数据库配置参数。

ALLOW WRITE ACCESS
指定在计算统计信息时,其他用户可以从表中读取和写入表。 对于统计视图,这些是视图定义中引用的基本表。

对于同时发生大量插入、更新或删除的表,建议不要使用 ALLOW WRITE ACCESS 选项。 RUNSTATS 命令首先收集表统计信息,然后执行索引统计信息。 在收集表和索引统计信息的时间之间的表状态的更改可能会导致不一致。 虽然具有最新的统计信息对于优化查询很重要,但具有一致的统计信息也很重要。 因此,在插入、更新或删除时,必须至少收集一次统计信息。

ALLOW READ ACCESS
指定计算统计信息时,其他用户可以对表具有只读访问权。 对于统计视图,这些是视图定义中引用的基本表。
TABLESAMPLE BERNOULLI
从表或统计视图中收集有关行样本的统计信息。 Bernoulli 采样分别考虑每一行,包括概率为 P/100 的行(其中 Pnumeric-literal 参数的值),并将其排除在概率 1-P/100 之外。 因此,如果将 numeric-literal 参数的值求值为值 10(表示 10% 个样本),那么每行将包含在概率 0.1 中,并排除在概率 0.9 之外。 除非您指定可选的 REPEATABLE 参数,否则每次执行 RUNSTATS 命令通常都会生成表的不同样本。 所有数据页面都通过表扫描进行检索,但仅使用 numeric-literal 参数指定的行数的百分比用于收集统计信息。
TABLESAMPLE SYSTEM
从表中收集有关数据页面的样本的统计信息。 系统采样分别考虑每个页面,包括具有概率 P/100 的页面(其中 Pnumeric-literal 参数的值),并将其排除在概率 1-P/100 之外。 除非您指定可选的 REPEATABLE 参数,否则每次执行 RUNSTATS 命令通常都会生成表的不同样本。 通过在括号中指定 numeric-literal 参数来控制样本的大小,该参数表示要返回的表的近似百分比 P。 仅检索 numeric-literal 参数指定的数据页面的百分比,并将其用于收集统计信息。

对于统计视图,您只能将系统采样应用于视图定义中引用的单个基本表。 如果视图包含多个表,那么可以将统计视图中的单个表标识为与视图中使用的其他表的所有主键或唯一索引列一起使用系统采样。 如果统计视图不满足这些条件,那么将改为使用 Bernoulli 采样,并返回警告。

numeric-literal
指定要获取的样本的大小,以百分比表示 P。 此值必须是小于或等于 100 的正数,并且可以是 0 - 1 之间的数。 例如,值 0.01 表示 1/100 的 1/100,以便平均采样 10,000 中的一行。 值 0100 将被视为您未指定采样,而不管您是指定了 TABLESAMPLE BERNOULLI 还是 TABLESAMPLE SYSTEM 参数。 大于 100 或小于 0 的值被视为错误 (SQL1197N)。
REPEATABLE (integer-literal)
TABLESAMPLE 参数之后指定时,确保 RUNSTATS 命令的重复执行返回相同的样本。 integer-literal 参数指定表示要在采样中使用的种子的非负整数。 传递负面种子会导致错误 (SQL1197N)。 如果针对表或统计视图的活动导致自上次运行带有 TABLESAMPLE REPEATABLE 参数的命令以来对表或统计视图数据的更改,那么样本集可能会在可重复的 RUNSTATS 命令调用之间变化。 此外,为了确保结果一致,获取样本的方法 (使用 BERNOULLISYSTEM 参数) 必须相同。
INDEXSAMPLE BERNOULLI
收集索引中的行的样本的索引统计信息。 Bernoulli 采样分别考虑每一行,包括概率为 P/100 的行(其中 Pnumeric-literal 参数的值),并将其排除在概率 1-P/100 之外。 因此,如果 numeric-literal 参数的值为 10,表示 10%,那么每行将包含在概率 0.1 中,并排除在概率 0.9 之外。 每次执行 RUNSTATS 命令都可能产生不同的索引样本。 所有索引页面都通过索引扫描进行检索,但只有通过 numeric-literal 参数指定的行的百分比用于收集统计信息。 统计视图不支持 INDEXSAMPLE BERNOULLI 参数。
INDEXSAMPLE SYSTEM
收集索引页面的样本的统计信息。 系统采样分别考虑每个页面,包括具有概率 P/100 的页面(其中 Pnumeric-literal 参数的值),并将其排除在概率 1-P/100 之外。 每次执行 RUNSTATS 命令通常都会产生不同的索引样本。 通过在括号中指定 numeric-literal 参数来控制样本的大小,该参数表示要返回的索引的近似百分比 P。 仅检索 numeric-literal 参数指定的索引页面的百分比,并将其用于统计信息收集。 统计视图不支持 INDEXSAMPLE SYSTEM 参数。
SET PROFILE NONE
指定没有为此 RUNSTATS 调用设置统计信息概要文件。
SET PROFILE
在系统目录表中生成并存储特定统计信息概要文件,并执行 RUNSTATS 命令选项以收集统计信息。
SET PROFILE ONLY
在系统目录表中生成并存储特定统计信息概要文件,但不运行 RUNSTATS 命令选项。
UPDATE PROFILE
修改系统目录表中的统计信息概要文件,并运行更新的统计信息概要文件的 RUNSTATS 命令选项以收集统计信息。 不能使用 UPDATE PROFILE 参数来除去统计信息概要文件中的子句。
UPDATE PROFILE ONLY
修改系统目录表中的统计信息概要文件,而不运行更新的统计信息概要文件的 RUNSTATS 命令选项。 不能使用 UPDATE PROFILE ONLY 参数来除去统计信息概要文件中的子句。
UTIL_IMPACT_PRIORITY priority
指定将在 priority指定的级别对 RUNSTATS 进行调速。 priority1100范围内的数字,其中 100 表示最高优先级, 1 表示最低优先级。 优先级指定实用程序对其进行的调速量。 同一优先级的所有实用程序都承受相同的调速量,但低优先级的实用程序比高优先级的实用程序受到更多的限制。 如果未指定优先权,那么 RUNSTATS 的缺省优先级为 50。 省略 UTIL_IMPACT_PRIORITY 关键字将调用 RUNSTATS 实用程序,而无需调速支持。 如果指定了 UTIL_IMPACT_PRIORITY 关键字,但 util_impact_lim 配置参数设置为 100,那么实用程序将运行未调速。

对分区数据库中的表使用 RUNSTATS 命令时,仅在单个数据库分区上收集统计信息。 如果运行 RUNSTATS 命令的数据库分区具有该表的分区,那么该命令将在该数据库分区上运行。 否则,该命令将在数据库分区组中的第一个数据库分区上运行,在该分区组中,将对该表进行分区。

示例

  • 以下命令仅收集表上所有列的基本统计信息(无分布统计信息):
    RUNSTATS ON TABLE employee
  • 以下命令仅收集有关表的统计信息,带有列 empid 和 empname 的分布统计信息:
    RUNSTATS ON TABLE employee 
        WITH DISTRIBUTION ON COLUMNS (empid, empname) 
  • 以下命令仅在所有列上收集表的基本统计信息和分布统计信息。 该命令指定频率值的最大数目,并使用配置设置中的最大分位数值。
    RUNSTATS ON TABLE employee WITH DISTRIBUTION DEFAULT 
        NUM_FREQVALUES 50 
  • 以下命令仅在所有列和列组 JOB、WORKDEPT 和 SEX 上收集表的基本统计信息和分布统计信息:
    RUNSTATS ON TABLE employee ON ALL COLUMNS AND COLUMNS ((JOB, WORKDEPT, SEX)) 
        WITH DISTRIBUTION
  • 以下命令收集有关一组索引的统计信息:
    RUNSTATS ON TABLE employee for indexes empl1, empl2
  • 以下命令仅收集有关所有索引的统计信息:
    RUNSTATS ON TABLE employee FOR INDEXES ALL
  • 以下命令通过对详细索引统计信息集合使用采样来收集有关表和所有索引的基本统计信息:
    RUNSTATS ON TABLE employee AND SAMPLED DETAILED INDEXES ALL
    此命令相当于以下命令:
    RUNSTATS ON TABLE employee AND DETAILED INDEXES ALL
  • 以下命令收集有关表的基本统计信息,其中包含列 empid、empname 和 empdept 以及两个索引 Xempid 和 Xempname 的分布统计信息。 为 empdept 分别设置分布统计信息限制,而其他两列使用公共缺省值。
    RUNSTATS ON TABLE employee 
      WITH DISTRIBUTION ON COLUMNS (empid, empname, empdept NUM_FREQVALUES 
              50 NUM_QUANTILES 100)  
              DEFAULT NUM_FREQVALUES 5 NUM_QUANTILES 10
              AND INDEXES Xempid, Xempname
  • 以下命令收集索引和所有索引中使用的所有列的统计信息:
    RUNSTATS ON TABLE employee ON KEY COLUMNS AND INDEXES ALL
  • 以下命令将收集有关所有索引的统计信息,以及为其中一个列分别设置分布和分布统计信息信息的所有列。 在此示例中, T1 包含列 c1, c2, .... c8
    RUNSTATS ON TABLE T1 
      WITH DISTRIBUTION ON COLUMNS (c1, c2, c3 NUM_FREQVALUES 20 
      NUM_QUANTILES 40, c4, c5, c6, c7, c8)
      DEFAULT NUM_FREQVALUES 0, NUM_QUANTILES 0 AND INDEXES ALL 
                                                     
    RUNSTATS ON TABLE T1 
      WITH DISTRIBUTION ON COLUMNS (c3 NUM_FREQVALUES 20 NUM_QUANTILES 40)
      AND INDEXES ALL
  • 以下命令收集各个列 c1 和 c5 以及列组(c2、c3)和(c2、c4)的表 T1 的统计信息。 多列基数对于查询优化器在估算数据相关列的谓词的过滤因子时很有用。
    RUNSTATS ON TABLE T1 ON COLUMNS (c1, (c2, c3),
        (c2, c4), c5)
  • 以下命令收集各个列 c1 和 c2 的表 T1 的统计信息。 对于列 c1,此命令还会收集 LIKE 谓词统计信息。
    RUNSTATS ON TABLE T1 ON COLUMNS (c1 LIKE STATISTICS, c2)
  • 以下命令注册统计信息概要文件,以仅在所有列上收集表的基本统计信息和分布统计信息。 该命令指定频率值的最大数目,并使用配置设置中的最大分位数值。
    RUNSTATS ON TABLE employee WITH DISTRIBUTION DEFAULT 
       NUM_FREQVALUES 50 SET PROFILE
  • 以下命令注册统计信息概要文件,以仅在所有列上收集表的基本统计信息和分布统计信息。 该命令指定频率值的最大数目,并使用配置设置中的最大分位数值。 未收集统计信息。
    RUNSTATS ON TABLE employee WITH DISTRIBUTION 
        DEFAULT NUM_FREQVALUES 50 SET PROFILE ONLY
  • 以下命令通过更改 50 - 30 范围内的最大频率值数来修改先前注册的统计信息概要文件。 该命令还将更新指定的统计信息。
    RUNSTATS ON TABLE employee WITH DISTRIBUTION 
        DEFAULT NUM_FREQVALUES 30 UPDATE PROFILE
  • 以下命令通过更改 50 - 30 范围内的最大频率值数来修改先前注册的统计信息概要文件。 未收集统计信息。
    RUNSTATS ON TABLE employee WITH DISTRIBUTION 
        DEFAULT NUM_FREQVALUES 30 UPDATE PROFILE ONLY
  • 以下命令通过添加列 empl_address 和列组(empl_title、empl_salary)选项来修改先前注册的统计信息概要文件。 该命令还将更新指定的统计信息。
    RUNSTATS ON TABLE employee 
     ON COLUMNS (empl_address, (empl_title, empl_salary))
     UPDATE PROFILE
  • 以下命令通过添加列 empl_address 和列组(empl_title、empl_salary)选项来修改先前注册的统计信息概要文件。 未收集统计信息。
    RUNSTATS ON TABLE employee 
     ON COLUMNS (empl_address, (empl_title, empl_salary))
     UPDATE PROFILE ONLY
  • 以下命令通过使用该表的统计信息概要文件中记录的选项来收集有关表的统计信息:
    RUNSTATS ON TABLE employee USE PROFILE
    
  • 以下命令查询与表的目录中先前注册的统计信息对应的 RUNSTATS 命令选项:
    SELECT STATISTICS_PROFILE FROM SYSCAT.TABLES WHERE TABNAME = 
        'EMPLOYEE'
  • 以下命令收集 30% 行的统计信息,包括分布统计信息:
    RUNSTATS ON TABLE employee WITH DISTRIBUTION 
        TABLESAMPLE BERNOULLI(30)
  • 要控制收集统计信息的样本集,并能够重复使用同一样本集,您可以执行以下操作:
    RUNSTATS ON TABLE employee WITH DISTRIBUTION 
        TABLESAMPLE BERNOULLI(30) REPEATABLE(4196)
    如果数据在临时中未更改,那么命令将生成相同的统计信息集。
  • 以下命令在 1.5% 的数据页上收集索引统计信息和表统计信息。 只对表数据页(而不是索引页)进行采样。 在此示例中,1.5% 的表数据页用于收集表统计信息,而所有索引页都用于索引统计信息。
    RUNSTATS ON TABLE employee AND INDEXES ALL TABLESAMPLE SYSTEM(1.5)
  • 以下命令在 1.5% 的数据页面收集表统计信息,在 2.5% 的索引页面上收集索引统计信息。 将对表数据页面和索引页面进行采样。
    RUNSTATS ON TABLE employee AND INDEXES ALL TAMBLESAMPLE SYSTEM(1.5)
        INDEXSAMPLE SYSTEM(2.5)
  • 以下命令在所有列上收集统计视图的统计信息,而不收集分布统计信息:
    RUNSTATS ON VIEW product_sales_view
  • 以下命令收集统计视图的基本统计信息,带有有关类别、类型和 product_key 列分布统计信息。 为类别列设置了分布统计信息限制,而其他列使用公共缺省值。
    RUNSTATS ON VIEW product_sales_view
     WITH DISTRIBUTION ON COLUMNS (category NUM_FREQVALUES 100 NUM_QUANTILES 100,
    		 type, product_key) DEFAULT NUM_FREQVALUES 50 NUM_QUANTILES 50
  • 以下命令通过使用行级别采样来收集 10% 行的统计视图的基本统计信息和分布统计信息:
    RUNSTATS ON VIEW product_sales_view
     WITH DISTRIBUTION TABLESAMPLE BERNOULLI (10)
  • 以下命令通过使用数据页级别采样来收集 2.5% 行的统计视图的基本统计信息和分布统计信息。 此外,此命令指定重复使用同一样本集。 要使此命令成功,查询必须使 Db2 数据库系统能够成功地将数据页采样推送到一个或多个表。 否则,将发出错误 (SQL 20288N)。
    RUNSTATS ON VIEW product_sales_view
     WITH DISTRIBUTION TABLESAMPLE SYSTEM (2.5) REPEATABLE(4196)
    
  • 以下命令将注册统计信息概要文件以收集有关视图和所有列的统计信息,并带有指定的分布统计信息:
    RUNSTATS ON VIEW product_sales_view
     WITH DISTRIBUTION DEFAULT NUM_FREQVALUES 50 NUM_QUANTILES 50
     SET PROFILE
  • 以下命令修改先前注册的统计信息概要文件。 此命令还将更新指定的统计信息:
    RUNSTATS ON VIEW salesdb.product_sales_view
     WITH DISTRIBUTION DEFAULT NUM_FREQVALUES 25 NUM_QUANTILES 25
     UPDATE PROFILE

使用说明

  • 您应该在下列情况下运行 RUNSTATS 命令:
    • 在已进行大量修改的表上: 例如,如果进行了许多更新,如果插入或删除了大量数据,或者如果在 LOAD期间运行了不带统计信息选项的 LOAD 命令。
    • 在使用 REORGREDISTRIBUTE DATABASE PARTITION GROUP 命令重组的表上。
    • 在行压缩的表上。
    • 在创建新索引之后。
    • 在绑定应用程序之前,其性能至关重要。
    • 当预取数量更改时。
    • 对于其基础表被大量修改以更改视图返回的行的统计视图。
    • 运行带有 STATISTICS 选项的 LOAD 命令后 (如果存在 XML 列)。 使用 RUNSTATS 实用程序来收集有关 XML 列的统计信息,因为 LOAD 命令不会收集有关这些列的统计信息,即使您使用 STATISTICS 选项也是如此。 使用 RUNSTATS 命令来仅收集 XML 列的统计信息时,将保留 LOAD 命令或先前执行 RUNSTATS 实用程序所收集的非 XML 列的统计信息。 如果先前收集了有关 XML 列的统计信息,那么删除这些统计信息(如果当前命令不收集有关该列的统计信息)或替换这些统计信息(如果当前命令确实收集有关该列的统计信息)。
  • 您选择的选项取决于特定的表和应用程序。 一般来说,以下准则适用:
    • 如果该表是关键查询中的关键表,且相对较小,或者没有进行过多更改,并且系统本身没有过多活动,那么可能值得花费精力来尽可能详细地收集统计信息。
    • 如果用来收集统计信息的时间受限,而且表相对较大,或者表频繁地更新,那么仅对谓词中使用的一组列运行 RUNSTATS 命令可能是有益的。 这样,您可以更经常地运行 RUNSTATS 命令。
    • 如果用来收集统计信息的时间受限,并且按逐个表基础定制 RUNSTATS 命令的精力是主要问题,请考虑只收集 KEY 列的统计信息。 假定索引包含对表至关重要且最有可能出现在谓词中的列集。
    • 如果用来收集统计信息的时间受限,并且要收集表统计信息,请考虑使用 TABLESAMPLE 选项来收集有关表数据的子集的统计信息。
    • 如果用来收集统计信息的时间受限,并且要收集索引统计信息,请考虑使用 INDEXSAMPLE 选项来收集有关索引数据的子集的统计信息。
    • 如果类型为 "column = constant"的某些列和谓词中存在偏差,那么为这些列指定更大的 NUM_FREQVALUES 值可能是有益的。
    • 收集在平等谓词中使用且值分布可能被扭曲的所有列的分布统计信息。
    • 对于具有范围谓词 (例如 "column >= constant""column BETWEEN constant1 AND constant2") 或类型为 "column LIKE '%xyz'"的列,指定更大的 NUM_QUANTILES 值可能是有益的。
    • 如果存储空间是一个问题,并且您没有大量时间来收集统计信息,请不要为您在谓词中不使用的列指定高 NUM_FREQVALUESNUM_QUANTILES 值。
    • 如果您需要索引统计信息,并且从不在包含索引的表上收集统计信息,那么将计算表和索引上的统计信息。
    • 如果您不需要表中 XML 列的统计信息,那么可以使用 EXCLUDING XML COLUMNS 参数来排除所有 XML 列。 此参数优先于为统计信息收集指定 XML 列的所有其他参数。
  • 运行命令后,请注意以下内容:
    • 要释放锁定,必须发出 COMMIT。
    • 要允许生成新的访问计划,必须重新绑定引用目标表的数据包。
    • 在表的某些部分上运行命令可能会导致自上次发出命令以来表上的活动导致不一致。 在这种情况下,将返回警告消息。

      如果仅在表上发出 RUNSTATS 命令,那么可能使表级别和索引级别的统计信息不一致。 例如,您可以收集表上的索引级别统计信息,稍后从表中删除大量行。 如果随后仅在表上发出 RUNSTATS 命令,那么表基数可能小于 FIRSTKEYCARD 的值,这是不一致的。 同样,如果在创建新索引时收集其统计信息,那么表级别统计信息可能不一致。

  • 如果您请求表统计信息,那么 RUNSTATS 命令将删除先前收集的分布统计信息。 例如, RUNSTATS ON TABLERUNSTATS ON TABLE … AND INDEXES ALL 命令导致删除先前收集的分布统计信息。 如果仅对索引运行命令,那么将保留先前收集的分布统计信息。 例如, RUNSTATS ON TABLE … FOR INDEXES ALL 命令会导致保留先前收集的分布统计信息。 如果仅在 XML 列上运行 RUNSTATS 命令,那么将保留先前收集的基本列统计信息和分布统计信息。 如果先前收集了有关 XML 列的统计信息,那么删除这些统计信息(如果当前命令不收集有关该列的统计信息)或替换这些统计信息(如果当前命令确实收集有关该列的统计信息)。
  • 当分区表上存在拆离分区时,仍然属于需要清除的已拆离数据分区的索引键不会计入统计信息中的键的一部分。 这些键不计入是因为它们是不可见的,并且不再是表的一部分。 它们最终将通过异步索引清除从索引中移除。 因此,在运行异步索引清除之前收集的统计信息具有误导性。 如果在异步索引清除完成之前发出了 RUNSTATS 命令,那么它可能会根据不准确的统计信息生成用于索引重组或索引清除的假警报。 运行异步索引清除后,将除去仍属于需要清除的已拆离数据分区的所有索引键,这可能会消除对索引重组的需求。

    对于分区表,鼓励您在完成异步索引清除后发出 RUNSTATS 命令,以在拆离数据分区存在的情况下生成准确的索引统计信息。 要确定表中是否存在拆离数据分区,您可以检查 SYSCAT.DATAPARTITIONS 目录视图中的状态字段,并查找值 L(逻辑拆离)、I(索引清除)或 D(与从属 MQT 拆离)。

    RUNSTATS 命令收集分区索引的所有索引分区的统计信息。 分区索引的前导列的统计信息可能不如非分区索引的前导列的统计信息准确。

  • RUNSTATS 命令在具有基于表达式的索引的表上运行,并且 RUNSTATS 命令在 AND INDEXESFOR INDEXES 子句中包含该索引时,还将收集该索引中基于表达式的键列的统计信息,并且将和与该索引相关联的系统生成的统计视图相关联。 表达式不能在 RUNSTATS 命令 (SQL0205N) 中指定为列。 要收集基于表达式的索引键列的定制统计信息,您可以通过使用统计视图中显示的列名称,来定义统计视图上与索引相关联的统计信息概要文件。 您还需要在基本表上定义统计信息概要文件,其中包括其 INDEXES 子句中的索引。
    注: 在基于索引的统计视图的表达式上定义统计信息概要文件时,如果一个统计信息概要文件尚不存在,那么自动生成的统计信息概要文件也会与基本表相关联。 定义统计信息概要文件后,带有 USE PROFILE 子句的基本表上的 RUNSTATS 命令会导致在索引中基于表达式的键列上收集定制统计信息。
  • 分布统计信息是通过 XML 列上定义的 XML 数据在索引上进行收集。 如果对带有 WITH DISTRIBUTION 参数的表运行 RUNSTATS 命令,那么将按如下所示收集类型为 XML 的列的分布统计信息:
    • RUNSTATS 命令必须同时收集分布统计信息和表统计信息,以收集 XML 列上定义的基于 XML 数据的索引的分布统计信息。 由于 XML 分布统计信息与表统计信息存储在一起,因此必须收集表统计信息以便收集分布统计信息。

      不需要索引子句来收集 XML 分布统计信息。 仅指定索引子句不会收集 XML 分布统计信息。

      缺省情况下,XML 分布统计信息对 XML 数据的每个索引使用最多 250 个分位数。 在 XML 列上收集分布统计信息时,可以通过在 ON COLUMNSDEFAULT 子句中指定 NUM_QUANTILES 参数的值来更改分位数的最大数目。

    • 收集基于 XML 数据类型为 VARCHAR、DOUBLE、TIMESTAMP 和 DATE 的索引的分布统计信息。 不会通过索引收集类型为 VARCHAR HASHED 的分布统计信息。
    • 不会通过 XML 数据为在分区表上定义的分区索引收集分布统计信息。
  • 目录表中的特殊系统生成的索引表示范围集群表的范围排序属性。 收集此类型表的统计信息时,还将为系统生成的索引收集统计信息。 统计信息反映了范围查找的快速访问,方法是将索引表示为具有与基本数据表一样多的页面的二级索引,并将基本数据完全按索引顺序进行集群。
  • 在命令的 On Dist Cols 子句中,列组不支持“频率”选项和“分位数”选项参数。 单个列支持这些参数。
  • 无法以 DMS 方式计算三种类型的预取统计信息。 在索引目录中的索引统计信息中,您将看到以下统计信息的 -1 值:
    • AVERAGE_SEQUENCE_FETCH_PAGES
    • AVERAGE_SEQUENCE_FETCH_GAP
    • AVERAGE_RANDOM_FETCH_PAGES
  • 统计信息概要文件以可视字符串格式(该格式表示 RUNSTATS 命令)存储在 SYSCAT.TABLES 系统目录表的 STATISTICS_PROFILE 列中。
  • XML 类型列上的统计信息收集由两个 Db2 注册表变量管理: DB2_XML_RUNSTATS_PATHID_KDB2_XML_RUNSTATS_PATHVALUE_K。 这两个注册表变量与 NUM_FREQVALUES 参数相似,因为它们指定要收集的频率值的数目。 如果未设置该参数,那么将使用缺省值 200
  • 在开始运行 RUNSTATS 命令时,它将获取 SYSTABLES 表上的 IX 表锁定以及您正在收集统计信息的表行上的 U 锁定。 操作仍然可从 SYSTABLES 表中读取,包括使用 U 锁定的表中的行。 如果不针对具有 U 锁定的行进行写操作,那么也可以执行写操作。 但是,由于 RUNSTATS 命令获取的 IX 锁定,另一个阅读器或写程序无法获取 SYSTABLES 表上的 S 锁定。
  • 对于具有结构化类型的列,不会收集统计信息。 如果指定了这些数据类型,那么将忽略具有这些数据类型的列。
  • 对于具有 LOB 或 LONG 数据类型的列,仅收集 AVGCOLLEN 和 NUMNULLS。 AVGCOLLEN 表示列存储在数据库内存或临时表中时的平均空间(以字节计)。 此值表示 LOB 或 LONG 数据类型的数据描述符的长度,除非在数据页上内联 LOB 数据时。 在磁盘上存储列所需的平均空间可以与此统计信息所表示的值不同。
  • UNSAMPLED DETAILED 选项可用于更改收集索引统计信息的方式,但仅在清除缺省值或 DETAILED 不起作用的情况下才应使用。
  • 使用 INDEXSAMPLE 参数时,不能在单个命令中为不同的索引指定不同的索引采样率。 例如,以下命令无效:
    runstats on table orders and index o_ck indexsample system(5), 
       index o_ok indexsample system(10)
    您可以使用以下两个 RUNSTATS 命令来实现必需的结果:
    runstats on table orders and index o_ck indexsample system(5)
    runstats on table orders for index o_ok indexsample system(10)
  • 如果自上次对表或其索引收集统计信息以来修改了表,那么必须运行 RUNSTATS ON TABLE … AND INDEXES ALL。 如果使用 RUNSTATS ON TABLE … FOR INDEXES ALL,那么生成的统计信息可能不一致。