DB2 10.5 for Linux, UNIX, and Windows

扩展行大小

扩展行大小支持允许您创建符合以下条件的表:其行长度可超过表空间的页大小的最大记录长度。

表数据行组织成称为“页”的块,页大小可以是下列四种:4、8、16 和 32 千字节。在特定大小的表空间中创建的所有表都具有匹配的页大小。
表 1. 对每个表空间页大小中列和行大小的数字的限制
页大小 行大小限制 列计数限制
4K 4 005 500
8K 8 101 1 012
16K 16 293 1 012
32K 32 677 1 012
在没有扩展行大小支持的情况下,表行中允许的最大字节数取决于表空间的页大小。如果尝试创建行长度超过页大小最大记录长度的表,会导致错误 (SQLSTATE 54010)。例如,由于其行大小的原因,在 4K 页大小表空间中无法创建下表。
CREATE TABLE T1 (C1 INTEGER, C2 VARCHAR(5000))
此表的行大小是 5010 字节;计算为 5 字节(C1 加可空列开销)+ 5005 字节(C2 加变长列开销)

在具有扩展行大小支持的情况下,可创建包含大型行(它们超过表空间的页大小的最大记录长度)的表。在具有扩展行大小支持的情况下,可在 4K 页大小表空间中创建表 T1

可使用扩展行大小支持来执行下列任务:
  • 将具有超过 32K 的行大小的表迁移至 DB2® V10.5
  • 对于大部分数据行可包含在较小页面上,但是表定义需要较大页大小的情况,这有助于提高应用程序的性能。
  • 创建具有较多 VARCHAR 或 VARGRAPHIC 列的表。最大列数不会更改,但是支持超过页大小的最大记录长度会允许更多列。

可以变更现有表以利用扩展行大小支持。例如,可添加更多列,也可增大字符和图形字符串列的长度。在没有扩展行大小支持的情况下,这些更改将超过表空间的页大小的行大小。

由用户创建的任何行组织表都支持扩展行大小,范围集群表 (RCT) 除外。

使用具有扩展行大小的表

对表启用扩展行大小支持存在下列要求:
  1. extended_row_sz 数据库配置参数必须设置为 ENABLE。
  2. 表定义必须包含至少一个变长字符串列(VARCHAR 或 VARGRAPHIC)。
  3. 表的行大小不能超过 1048319 字节 (SQLSTATE 54010)。
  4. 需要具有扩展行的显式或隐式系统临时表的查询需要系统临时表空间,此系统临时表空间可完全包含行的最小宽度。行的最小宽度计算方式与最大宽度计算方式相同,除了假定所有 VARCHAR 和 VARGRAPHIC 列具有长度 1。

可通过检查 SYSCAT.TABLES 目录视图的 EXTENDED_ROW_SIZE 列来识别具有扩展行大小支持的表。

将数据插入到具有扩展行大小支持的表中
在具有扩展行大小支持的表中插入或更新数据行并且物理数据行长度超过表空间的最大记录长度时,会将变长字符串列(VARCHAR 或 VARGRAPHIC)的一部分作为大对象 (LOB) 数据存储在数据行外部。基本行中的表列由大小为 24 字节的描述符替换。对于 VARCHAR(n)(其中 n 小于或等于 24)或 VARGRAPHIC(n)(其中 n 小于或等于 12)的列,数据会保留在基本数据行中。

如果一些 VARCHAR 或 VARGRAPHIC 数据存储在行外部的 LOB 数据对象中,那么不存在任何对数据类型的更改。VARCHAR 或 VARGRAPHIC 列不会变为 LOB 列。诸如 IMPORT、EXPORT 和 LOAD 之类的操作不要求任何 LOB 修饰符使用 VARCHAR 或 VARGRAPHIC 数据。

示例

在下列示例中,extended_row_sz 数据库配置参数设置为 ENABLE。
在没有指定表空间的情况下创建表
发出了以下 CREATE TABLE 语句:
CREATE TABLE T1 (C1 INT, C2 VARCHAR(4000));
T1 的行大小为 4010 字节。如果找不到页大小至少为 8K 的表空间,那么会在 4K 页大小表空间中创建 T1,并且在需要时,可能将一些变长数据存储在行外部。如果不存在任何可使用的 4K 页大小表空间,那么会返回错误 (SQLSTATE 42727)。
添加列
已使用以下 CREATE TABLE 语句来创建表 T1
CREATE TABLE T1 (C1 INT, C2 VARCHAR(3995)) in TS1;
表空间 TS1 具有 4K 页大小,因此,创建表 T1 时不需要将任何数据存储在行外部(因为该表的字节计数为 4005)。在使用以下 ALTER TABLE 语句的情况下,会将新列添加至表 T1
ALTER TABLE T1 ADD C3 CLOB(1M);
现在,该表的字节计数超过最大记录长度。由于 extended_row_sz 数据库配置参数设置为 ENABLE,因此 ALTER TABLE 成功。
取消激活 VALUE COMPRESSION
已使用以下 CREATE TABLE 语句来创建表 T1
CREATE TABLE T1 (C1 INT, C2 VARCHAR(1993), C3 VARCHAR(2000))
 IN TS1 VALUE COMPRESSION;
表空间 TS1 具有 4K 页大小并且表 T1 的字节计数为 4005,因此,不会将任何数据存储在行外部。在使用以下 ALTER TABLE 语句的情况下,会取消激活对表 T1 的压缩:
ALTER TABLE T1 DEACTIVATE VALUE COMPRESSION;
这会将表 T1 的字节计数更改为 4008。由于 extended_row_sz 数据库配置参数设置为 ENABLE,因此 ALTER TABLE 成功。需要时,可能会将一些变长数据存储在行外部。

如果重新激活了 VALUE COMPRESSION,那么会将任何后续插入的 VARCHAR 数据都存储在基本行中。在 VALUE COMPRESSION 已取消激活时插入的所有行都会保留在行外部,直到对它们进行更新或重组表 T1 为止。

创建索引
已使用以下 CREATE TABLE 语句来创建表 T1
CREATE TABLE T1
 (C1 INT, C2 VARCHAR(1000),
  C3 VARCHAR(1000),
  C4 VARCHAR(1000),
  C5 VARCHAR(1000))
 IN TS1;
表空间 TS1 具有 4K 页大小并且表 T1 已成功创建(因为 extended_row_sz 数据库配置参数设置为 ENABLE)。对表 T1 创建索引时,不需要进行任何特殊处理。
CREATE INDEX I1 on T1 (C2);
CREATE INDEX I2 on T1 (C3);
CREATE INDEX I3 on T1 (C4);
CREATE INDEX I4 on T1 (C5);