DB2/400SQL:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;分配;指示

DB2/400SQL:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;分配;指示,sql,db2-400,Sql,Db2 400,一个DB2/400SQL问题:在下面的语句中,当创建一个带有“ALLOCATE”的列时 语句,这是否意味着数据库引擎创建初始大小为20兆的列? 因为系统表的分析表明,该列的列数为2G,7M “长度”列中显示的大小是否与分配的大小相对应,或与该列的最大大小相对应 DB2forIBMi将表数据存储为两部分 固定长度行缓冲区表空间和溢出空间 如果一个表只有固定长度的列,那么所有数据都在表空间中 ALLOCATE(x)表示数据库在表空间中为列分配x字节,其余字节存储在溢出空间中 可变类型的默认值是all

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

“长度”列中显示的大小是否与分配的大小相对应,或与该列的最大大小相对应


DB2forIBMi将表数据存储为两部分

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

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

ALLOCATE(x)
表示数据库在表空间中为列分配x字节,其余字节存储在溢出空间中

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

实际情况是,除非您明确指定
allocate(0)
,否则
varchar(30)
或更小的值存储在固定长度的表空间中以提高性能

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

IBM建议使用
allocate(x)
,其中x足够大,可以处理至少80%的值

正如您自己所看到的,length是列的最大大小

例如,IBM ACS的模式工具显示了分配的长度

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

我认为对于大型对象,分配任何内容都没有意义,因为最大行缓冲区大小是32K。并且,从SQL引用来看:分配的值可能在字符串的1到最大长度之间,受最大行缓冲区大小限制的限制。@jmarkmurphy 32K max row仅在没有XML或LOB时适用。。。如果根据指定了LOB或XML列,则最大行数据大小为3 758 096 383,但这是行缓冲区大小限制吗?我质疑这一点的原因是,将物理记录限制在32K会很奇怪,但如果有LOB,它可以是3G。我相信物理记录的大小仍然是32K,多余的存储在可变空间中。我没有足够的信息来确定,我找到了。最大行缓冲区大小为32766,如果指定了VARCHAR、VARGRAPHIC、VARBINARY、LOB或XML列,则为32740。因此,allocate()即使有LOB或XML,也不能分配超过32K的内存。这只会带来更多的问题,而不是答案。