首页 > 解决方案 > DB2/400 SQL:“分配”指令

问题描述

一个 DB2/400 SQL 问题:在下面的语句中,当使用“ALLOCATE”语句创建列时,这是否意味着数据库引擎会创建初始大小为 20 Mega 的列?因为系统表的分析表明该列有2G,7M的列。

“LENGHT”列中指示的大小是否对应于分配的大小,或对应于列的最大大小?

在此处输入图像描述

标签: sqldb2-400

解决方案


Db2 for IBM i 将表数据存储为两部分。

固定长度的行缓冲区表空间和溢出空间。

如果一个表只有固定长度的列,则所有数据都在表空间中。

ALLOCATE(x)表示 Db 在表空间中为该列分配 x 个字节,其余的存储在溢出空间中。

可变类型的默认值是allocate(0),因此理论上整个可变值都存储在溢出空间中。

Reality isvarchar(30)或更小存储在固定长度的表空间中以提高性能,除非您明确指定allocate(0).

重要的原因是,如果查询同时访问固定长度的表空间和溢出空间,则需要 2 个 I/O 来检索所有数据。

IBM 建议使用allocate(x)where x 足够大以处理您拥有的至少 80% 的值。

如您所见,长度是列的最大大小。

例如,IBM ACS 的模式工具会向您显示分配的长度......

create table mytable (
  mykey integer
  , myclob clob(200000) allocate(2000)
);

ACS 表定义截图


推荐阅读