您可以为某个表生成统计信息,还可以为查询所访问的每个表构建数据分发。
只要执行 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 系统目录表 的 colmin 和 colmax 列中的值。
第一次使用数据分发统计信息时,尝试以 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.0 的分辨率和 0.99 的置信度。
UPDATE STATISTICS MEDIUM DISTRIBUTIONS ONLY;
UPDATE STATISTICS FOR TABLE t1(a,b,e,f);
UPDATE STATISTICS HIGH FOR TABLE t2;
由于该语句只对每条索引构造一次统计信息,因而这些步骤确保 UPDATE STATISTICS 能够快速执行。
CREATE INDEX ix_1 ON t1 (a, b, c, d) ... CREATE INDEX ix_3 ON t1 (f) ...
UPDATE STATISTICS HIGH FOR TABLE t1(a); UPDATE STATISTICS HIGH FOR TABLE t1(f);
这些 UPDATE STATISTICS HIGH 语句对索引列使用高分布替换通过 UPDATE STATISTICS MEDIUM 语句创建的分布。
例如:假设您在表 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) ...
UPDATE STATISTICS HIGH FOR TABLE t1(c); UPDATE STATISTICS HIGH FOR TABLE t1(e);
此外,您可以对列 b 运行 UPDATE STATISTICS HIGH,但是该步骤通常不是必须的。