DB2 V10.1 for Linux, UNIX, and Windows

以直接插入方式将 LOB 存储在表行中

通常,大对象 (LOB) 与引用它们的表行存储在不同的位置。但是,您可以选择以直接插入方式将长度不超过 32673 字节的 LOB 存储在基本表行中,以便简化对其进行的访问。

将大数据对象存储在基本表行中可能并不现实(根据数据的不同,可能无法进行此存储)。图 1 提供了尝试将 LOB 存储在表行中的示例,并说明了为何这样做会引起问题。在此示例中,行被定义为包含两个 LOB 列,其长度为 500 和 145 千字节。但是,DB2® 表的最大行大小是 32 千字节;因此,这样的行定义实际上根本无法实现。

图 1. 将 LOB 数据存储到基本表行时存在的问题
此图说明尝试将两个超过 32 KB 的 LOB 存储在基本表行中

为了降低使用 LOB 时的难度,处理它们的方式与处理其他数据类型不同。图 2 显示只将 LOB 描述符(而不是 LOB 本身)存储在基本表行中。每个 LOB 本身都存储在数据库管理器所控制的另一 LOB 位置。采用这种安排方式后,包含 LOB 描述符的行与包含完整 LOB 的行相比,将缩短在缓冲池与磁盘存储器之间移动它们所需的时间。

但是,由于实际的 LOB 与基本表行存储在不同的位置,因此处理 LOB 数据变得更为困难。

图 2. 基本表行中的 LOB 描述符引用独立 LOB 位置中的 LOB
此图说明如何在基本表行中使用 LOB 描述符。

为了简化对较小的 LOB 的处理,您可以选择将小于所指定大小阈值的 LOB 数据以直接插入方式存储在基本表行中。于是,可以将这些 LOB 数据类型作为基本表行的组成部分进行处理,从而简化移动到缓冲池以及从缓冲池移动之类的操作。另外,如果已启用行压缩功能,那么将对直接插入式 LOB 进行行压缩。

CREATE 和 ALTER TABLE 语句的 INLINE LENGTH 选项允许将小于所指定长度限制的 LOB 数据存储在基本表行中。缺省情况下,即使未对 INLINE LENGTH 指定显式的值,小于列的最大大小 LOB 描述符的 LOB 也始终存储在基本表行中。

对于直接插入式 LOB,基本表行如图 3 所示。

图 3. 存储在基本表行中的小型 LOB
此图说明以直接插入方式将较小的 LOB 包括在基本表行中

当您考虑选择用于以直接插入方式存储 LOB 的阈值时,请考虑数据库的当前页大小以及直接插入式 LOB 是否会导致行大小超出当前页大小。表中的行的最大大小是 32677 字节。但是,每个直接插入式 LOB 都将产生需要的 4 个字节的额外存储。因此,以直接插入方式存储的每个 LOB 都将使行中的可用存储量减少 4 个字节。所以,直接插入式 LOB 的最大大小是 32673 字节。

注: 与采用直接插入方式存储 LOB 相同,还可以采用直接插入方式来存储 XML 数据。