sysdistrib 系统目录表存储数据分发信息以供查询优化器使用。数据分发为优化器提供了详细的表和列信息以改进 SELECT 语句的执行路径的选择。
列 | 类型 | 解释 | |
---|---|---|---|
tabid | INTEGER | 标识从中收集数据值的表的代码 | |
colno | SMALLINT | 源表中的列号 | |
seqno | INTEGER | 多个条目的顺序号码 | |
constructed | DATETIME YEAR TO FRACTION(5) | 创建数据分发时的日期 | |
mode | CHAR(1) | 优化级别:M = 中 H = 高 | |
resolution | SMALLFLOAT | 在 UPDATE STATISTICS 语句中指定 | |
confidence | SMALLFLOAT | 在 UPDATE STATISTICS 语句中指定 | |
encdat | STAT | 统计信息 | |
type | CHAR(1) | 统计信息的类型:
A = encdat 在固定长度字符字段中具有 ASCII 编码的直方图 S = encdat 具有用户定义的统计信息 |
|
smplsize | SMALLFLOAT | 大于 0 且不超过 1.0 的值表示 UPDATE STATISTICS 对表中总行数采样的比例。大于 1.0 的值表示 UPDATE STATISTICS 所采样的实际使用行数。值 0 表示未指定采样大小。UPDATE STATISTICS HIGH 总是更新所有行的统计信息。 | |
rowssampled | FLOAT | 样本中的行数 | |
constr_time | DATETIME YEAR TO FRACTION(5) | 记录分发的时间 | |
ustnrows | FLOAT | 计算分发时分段中的行。 | |
ustbuildduration | INTERVAL HOUR TO FRACTION(5) | 计算此列的分发统计信息所花费的时间 | |
nupdates | FLOAT | 表的更新数 | |
ndeletes | FLOAT | 表的删除数 | |
ninserts | FLOAT | 表的插入数 |
当以方式 MEDIUM 或 HIGH 对某张表执行 UPDATE STATISTICS 语句时,会将信息存储在 sysdistrib 表中。(UPDATE STATISTICS LOW 不会将值插入到 mode 列中。)
只有用户 gbasedbt 才能选择 encdat 列。
sysdistrib 系统目录表中的每一行都使用 tabid 和 colno 列(为它们收集统计信息)作为键。
对于内置数据类型的列,将类型字段设置为 A。encdat 列存储用 ASCII 编码的直方图,此直方图分为多行,每行包含 256 个字节。
在 GBase 8s 中,对于用户定义的数据类型的列,type 字段设置为 S。encdat 列以多重表示格式存储由 statcollect 用户定义的例程收集的统计信息。对每个 tabid 和 colno 对只存储一行。tabid、colno 和 seqno 列的组合索引只允许这些值的唯一组合。
以下三个 DML 计数器列会记录在生成列分发统计信息时对表执行修改数据行的 DML 操作的计数:
这些计数还可包括 MERGE 语句修改的行。
这些 DML 计数器列会存储在生成分发统计信息时存在的服务器分区中的计数器值。如果 AUTO_STAT_MODE 配置参数、AUTO_STAT_MODE 会话环境设置或 UPDATE STATISTICS 语句的 AUTO 关键字已启用数据分发统计信息的选择性更新,那么 ninserts、ndeletes 和 ninserts 值可影响 UPDATE STATISTICS 操作是否刷新现有数据分发统计信息。当以 MEDIUM 或 HIGH 方式对表运行 UPDATE STATISTICS 语句时,数据库服务器会比较这些列中的已存储值与分区中的当前值。如果已存储值之和不同于分区页面中的这些当前 sysdistrib DML 计数器值之和,少于 STATCHANGE 表属性或 STATCHANGE 配置参数的设置所指定的阈值,那么不会更新表的列分发统计信息。