haoqingyun
作者haoqingyun·2016-11-03 14:02
数据库运维工程师·CMBC

深入理解 DB2 INSERT 内部机制以及表空间分配机制

字数 758阅读 1471评论 1赞 3

周一早上某业务系统负责人找了过来,
——"我们的一个表空间在这个周末使用量增加了一倍!马上要满了,快帮我们看看!"
——"你们周末做什么操作了?导入数据了?"
——"是在 insert 一批新数据,但数据量不大,而且 insert 失败然后 rollback 了"
——"看看……"

登录数据库服务器以及应用服务器一番查看,表里的行数确实没什么变化,但表空间的 Used pages 却是翻了一倍;应用程序如他所述,批量 insert 1 万行数据,由于其中一行主键重复导致 insert 失败然后 rollback,但却重试了 2000 多次……

看到这儿已经基本上有了初步的结论,这 2000 多次的 insert / rollback 导致 DB2 从表空间里持续的为这个表分配了新的空间(extent),尽管最终没有新的数据插入,但这个过程中 DB2 分配了的空间并没有还给表空间,也就是说这些增长的 Used pages 应该都是空闲的数据页。

——"不对啊,这些 insert / rollback 是串行做的,应该每次 rollback 之后释放出来的 page 可以被下次的 insert 重新利用,而且大小正合适!"
—— "就喜欢你这个较真的风格!我们详细展开说说,事情是这样的……"

https://www.ibm.com/developerworks/cn/data/library/dm-cn-db2insert-table-space/index.html

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论1 条评论

icycastleicycastle课题专家组数据库管理员某证券公司
2017-04-14 17:58
文章分析的很精彩,有个疑问,实验中插入40000行记录,占用了4160个page,然后反复插入和回滚1000行记录,100次后表占用了5248个page; 按照insert时FSCR扫描的原理,第一次插入的时候扫面5个FSCR页,共2500个page,没有找到合适的空间,插入会append到表的最后,然后rollback,这些新插入的页就会标记为deleted; 第二次插入,从2501个page开始继续扫面,应该在第4160个page后发现有可用空间了,插入的page是不是就应该在4160后了呢,然后回滚,这些页再次被标记为deleted; 第三次开始直至第100次,也应该还是直接在第4160个page后插入,然后回滚; 这样的话,表的大小应该只是略微增长,而不应该是增加了26%的数据页?
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广