sql - DB2/400 SQL:“分配”指令
问题描述
一个 DB2/400 SQL 问题:在下面的语句中,当使用“ALLOCATE”语句创建列时,这是否意味着数据库引擎会创建初始大小为 20 Mega 的列?因为系统表的分析表明该列有2G,7M的列。
“LENGHT”列中指示的大小是否对应于分配的大小,或对应于列的最大大小?
解决方案
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)
);
推荐阅读
- python - 使用pytest时无法导入子模块
- scala - 使用java调用scala编译
- python - 具有形状 = [] 的 TensorFlow tf.placeholder
- python - 从 python 中的不同目录导入错误(错误 - 没有名为 app 的模块)
- sql - 是否可以进行一个 sql 查询来选择一行以及从关系到其他两个表的所有关联行
- jquery - 如何检查动态复选框并通过委托发布到 ajax?
- angular - 在 Rx 中使用 FlatMap 的正确方法?
- intel-mkl - 将 Ipopt 与 MKL 链接,MUMPS 的问题
- python - MLPRegressor 预测具有上限和下限
- string - Base64 中的“=”符号