创建数据分发

您可以为某个表生成统计信息,还可以为查询所访问的每个表构建数据分发。

(当自动生成统计信息时不需要运行 UPDATE STATISTICS 语句。)

只要执行 UPDATE STATISTICS MEDIUM 或 UPDATE STATISTICS HIGH 命令,数据库服务器就会创建向优化器提供信息的数据分发。

要点:

数据库服务器通过对列的数据进行取样、排序数据、构建分发容器和将结果插入 sysdistrib 系统目录表中来创建数据分发。

您可以通过关键字 HIGH 或 MEDIUM 控制扫描的样本大小。UPDATE STATISTICS HIGH 和 UPDATE STATISTICS MEDIUM 之间的差异在于取样的行数。根据 UPDATE STATISTICS 语句使用的置信度和分辨率,UPDATE STATISTICS HIGH 扫描整个表,而 UPDATE STATISTICS MEDIUM 仅对一部分行采样。

对于标准索引键,您可以将 LOW 关键字和 UPDATE STATISTICS 语句一起使用。

如果已经为某一列生成了分布,优化器会使用该信息来估计与针对某列的查询相匹配的行数。 当优化器估计返回的行数时,sysdistrib 中的数据分发会替代 syscolumns 系统目录表 的 colmincolmax 列中的值。

第一次使用数据分发统计信息时,尝试以 MEDIUM 方式更新所有表的统计信息,然后以 HIGH 方式更新索引所有起始列的统计信息。此策略将为您指定的列生成统计查询估计值。 这些估计值平均误差范围小于表中总行数的 percent,其中 percent 是使用 MEDIUM 方式时在 RESOLUTION 子句中指定的值。MEDIUM 方式的缺省百分比值是 2.5%。(对于 HIGH 方式分布的列,缺省分辨率为 0.5%。)

使用 DISTRIBUTIONS ONLY 选项,可以在表级别上或对整个系统执行 UPDATE STATISTICS MEDIUM,因为额外列的开销并不大。

仅当使用 UPDATE STATISTICS 的 HIGH 选项时,数据库服务器才使用 DBSPACETEMP 环境变量指定的存储位置。

将 DBUPSPACE 环境变量的第三个参数设置为值 1,可防止 UPDATE STATISTICS 操作在对行进行排序时使用索引。

对于您的查询访问的每个表,应根据以下准则 建立数据分发。另见准则下的示例。

要生成有关表的统计信息:

  1. 标识出现在表的任何单列或多列索引中的所有列的集合。
  2. 标识包括任何索引的第一列以外的所有列的子集。
  3. 对该子集中的每一列运行 UPDATE STATISTICS LOW。

要为您的查询访问的每个表构建数据分发:

  1. 为表中所有不是索引起始列的列运行单个 UPDATE STATISTICS MEDIUM。

    如果表不是非常大,那么可以使用缺省参数,在此情况下,您应使用 1.0 的分辨率和 0.99 的置信度。

  2. 运行以下 UPDATE STATISTICS 语句可创建非索引连接列和非索引过滤器列的分布:
    UPDATE STATISTICS MEDIUM DISTRIBUTIONS ONLY;
    
  3. 为所有索引起始列运行 UPDATE STATISTICS HIGH。为了使 UPDATE STATISTICS 语句的执行时间最短,您必须对每一列执行一条 UPDATE STATISTICS HIGH 语句,如该过程下的示例所示。
  4. 如果您具有以相同列的子集开头的索引,那么对每个不同的索引中的第一列运行 UPDATE STATISTICS HIGH,如该过程下的第二个示例所示。
  5. 对于表的每个单列或多列索引:
    1. 标识出现在索引中的所有列的集合。
    2. 标识包括任何索引的第一列以外的所有列的子集。
    3. 对该子集中的每一列运行 UPDATE STATISTICS LOW。(缺省值为 LOW。)
  6. 对于在步骤 3 中创建索引的表,运行以下 UPDATE STATISTICS 语句,以 更新 sysindexessyscolumns 系统目录表,示例如下:
    UPDATE STATISTICS FOR TABLE t1(a,b,e,f);
    
  7. 对于小型表,运行 UPDATE STATISTICS HIGH,例如:
    UPDATE STATISTICS HIGH FOR TABLE t2;
    

由于该语句只对每条索引构造一次统计信息,因而这些步骤确保 UPDATE STATISTICS 能够快速执行。

示例

后跟索引的所有列的 UPDATE STATISTICS HIGH 语句示例
假设您具有一个表 t1,其中列 abcdef 具有以下索引:
CREATE INDEX ix_1 ON t1 (a, b, c, d) ...
CREATE INDEX ix_3 ON t1 (f) ...
对索引的起始列运行以下 UPDATE STATISTICS 语句:
UPDATE STATISTICS HIGH FOR TABLE t1(a);
UPDATE STATISTICS HIGH FOR TABLE t1(f);

这些 UPDATE STATISTICS HIGH 语句对索引列使用高分布替换通过 UPDATE STATISTICS MEDIUM 语句创建的分布。

每个不同索引中第一列的 UPDATE STATISTICS HIGH 语句示例:

例如:假设您在表 t1

上具有以下索引:
CREATE INDEX ix_1 ON t1 (a, b, c, d) ...
CREATE INDEX ix_2 ON t1 (a, b, e, f) ...
CREATE INDEX ix_3 ON t1 (f) ...
步骤 3 对列 a 和列 f 执行 UPDATE STATISTICS HIGH。然后对列 ce 运行 UPDATE STATISTICS HIGH。
UPDATE STATISTICS HIGH FOR TABLE t1(c);
UPDATE STATISTICS HIGH FOR TABLE t1(e);

此外,您可以对列 b 运行 UPDATE STATISTICS HIGH,但是该步骤通常不是必须的。