开发人员在修改一个表时,DB2数据库报SQL0670N错误,具体信息以下:数据库
这个错误是怎么引发的?又该怎么解决呢?ide
首先咱们看一下DB2数据库自身对这个错误的解释性能
这里告诉咱们在具备32K页大小的表空间中,行长度不能超过32677字节。spa
解决这个问题,咱们天然会想到增大行长度限制的表空间的大小或设置较大的pagesize ,固然也能够考虑下降一列或多列的长度来下降行长度。blog
先查看表空间的具体信息:索引
$ db2 list tablespaces show detail内存
表空间标识 = 9开发
名称 = TPMSget
类型 = 系统管理空间it
内容 = 任何数据
状态 = 0x0000
详细解释:
正常
总计页数 = 2084
可用页数 = 2084
已用页数 = 2084
未用页数 = 不适用
高水位标记(页) = 不适用
页大小(以字节计) = 32768
扩展数据块大小(页) = 32
预取大小(页) = 32
容器数 = 1
pagesize的值已经比较大了,能够考虑增大表空间。
DB2现有表空间扩容的方法
1)直接添加一个容器的例子:
db2 " ALTER TABLESPACE TPMS ADD (DEVICE '/dev/rhdisk9' 10000) "
加容器以后DB2会有一个自动balance的过程,可能会持续几个小时!!! 在线作有必定风险!
2)改变现有容器的大小(该方法不会触发balance,但若是表空间创建在裸设备上,则要扩冲裸设备空间):
db2 " ALTER TABLESPACE TPMS RESIZE (FILE '/conts/cont0' 2000, DEVICE '/dev/rcont1' 2000, FILE 'cont2' 2000) "
注意这种方式就是将原有的相应容器都改为大小是2000页
或者考虑下降一列或多列的长度来下降行长度。
例如:执行的SQL语句为
alter table tpms.tpms_target alter column "target_value_by" set data type varchar(4000);
若是报错,能够设一个小点的值varchar(2000),这样就执行成功了。若是2000还放不下,能够分红两个表,主键、字段;主键、其余字段
varchar类型的最大长度为8000,若是有更大的数据,还能够考虑long varchar或clob类型。
最后本例中的报错是经过设置CLOB类型解决的。
alter table tpms.tpms_target alter column "target_value_by" set data type clob(4000);
补充:varchar的最大长度是由DB2的表空间决定,在DB2中一行数据的大小不能超过表空间的pagesize。而clob,dbclob和blob大小为2GB。
通常来讲,为了提升性能,数据库须要专门建立一个用于存放大字段的表空间,数据表的大字段列应该将数据存放于对应的表空间中,这是由于不通过内存(缓冲池)直接读取的。
DB2的限制
1. 一个表的最大列数<=1012
2. 一个视图的最大列数<=5000
3. 一行的最大长度(字节)<=32677
4. 每一个分区中表的最大尺寸(千兆字节数)<=512
5. 每一个分区中索引的最大尺寸(千兆字节数)<=512
6. 每一个分区中表的最大行数<=4000000000
7. 最长索引关键字(字节数)<=1024
8. 一个索引关键字中的最大列数<=16
9. 一个表的最大索引数<=32767或存儲器
10. 一个SQL语句或视图中所引用的最大表数<=存儲器