关于DB2的表中行溢出的疑问?

对于行溢出(row overflow)有一点疑问,关于行溢出信息中心没有太详细的说明,根据一些书籍和资料介绍,所谓行溢出,主要发生在表中包含varchar变长字段的情况,对变长字段值进行更新后,记录的长度比以前更长,该行的总长度超过表所在表空间的pagesize,DB2就会把这行数据放到一个新的更大的page里面,而在原有的位置通过指针指向这个新页的rid,这样访问的时候就会有两次IO,影响性能。
其他说明:
A table write overflow occurs when a VARCHAR column is updated such that its length increases and, because the row is now larger (or wider), the row no longer fits on the data page where it was originally stored. DB2 relocates the row to a new data page and places a pointer in the original location to the new location.

A table read overflow occurs when DB2 attempts to read the row from its original location, then discovers the pointer and has to go read the row from its new location. Read overflows are particularly expensive because DB2 is now forced to do double the logical read I/O and probably double the physical I/O as well.
举个例子:
有一个表TEST_ROW_OVE(NAME1 VARCHAR(2000), NAME2 VARCHAR(1000)) 所在的表空间的pagesize是4k, 4096,则两个字段总长度为2000+1000=3000能够放下没问题,如果我要alter table 把字段NAME2长度改为3000,那么总长度就是2000+3000=5000,超过了4k,这时就会发生行溢出,按照书面的说法这时候这一行数据就会放到一个新的page里,比如pagesize为8k的一个page里,并用指针执行这个新page。

我的疑问是这样的:
1. alter table把字NAME2长度改为3000,即行总长度找过pagesize 4k的时候根本就无法修改成功,既然修改不成功了,就不会发生后面所说的溢出了。测试如下:

[db2inst1@test ~]$ db2 "alter table TEST.TEST_OVERFLOW3 alter column NAME2 set data type VARCHAR(3000)"
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0670N  The row length of the table exceeded a limit of "4005" bytes. (Table
space "USERSPACE1".)  SQLSTATE=54010

2. 如果要想放到pagesize为8k的page中,应该把这个表做迁移,放到pagesize为8k的新表空间中,那也
同样更不会出现所说的溢出情况。
请大家帮忙理解下,是不是我哪里理解错误了? 谢谢!!

参与7

2同行回答

tongshuaitongshuai数据库工程师北京新数科技有限公司
首先你的DB2版本是多少?DB2是允许行溢出的。你这里的问题是测试的系统缺省表空间,这个表空间页大小一般是4K,限制也相对比较多,因此不建议把表建在这个表空间,建议新建用户表空间。而新建用户表空间一般都没太多的限制,也允许行溢出,因此如果创建的8K页大小的表空间,里面的表也允...显示全部

首先你的DB2版本是多少?DB2是允许行溢出的。
你这里的问题是测试的系统缺省表空间,这个表空间页大小一般是4K,限制也相对比较多,因此不建议把表建在这个表空间,建议新建用户表空间。
而新建用户表空间一般都没太多的限制,也允许行溢出,因此如果创建的8K页大小的表空间,里面的表也允许修改字段大小超出页大小。不过如果有大页的需求就建议创建32K或者64K页大小的表空间,这样会好很多。

收起
互联网服务 · 2020-02-18
db2haodbdb2haodb数据库开发工程师IGI
谢谢tongshuai的回答,试了下应该和版本有关系。 我之前用的9.7, 不管是缺省表空间还是自己建的用户表空间都不能。在10.5上测试了下是可以的。多谢!显示全部

谢谢tongshuai的回答,试了下应该和版本有关系。 我之前用的9.7, 不管是缺省表空间还是自己建的用户表空间都不能。在10.5上测试了下是可以的。多谢!

收起
互联网服务 · 2020-02-18
浏览2229

提问者

db2haodb
数据库开发工程师IGI
擅长领域: 数据库存储前置系统

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2020-02-18
  • 关注会员:2 人
  • 问题浏览:4144
  • 最近回答:2020-02-18
  • X社区推广