平台人生
作者平台人生2016-11-18 11:57
软件开发工程师, 平台人生

Oracle开发建议系列第一期 ——高并发数据表慎用LOB字段

字数 1064阅读 5975评论 0赞 0

作者:周鹏

前言:
我们的数据库运维团队结合实际案例和运维经验,从数据库的运行风险、性能影响出发,梳理出Oracle数据库在设计、开发阶段的注意事项和最佳实践,形成一个系列,将陆续与大家分享。

本期内容:高并发数据表慎用LOB字段

LOB字段介绍

LOB字段是Oracle数据库用于存储大数据对象的字段类型,包括BLOB、CLOB、NLOB、BFILE,最大大小10gR2可以到8T,在11g可到128T(和block size有关)。单表定义中可以包括多个LOB字段。

和一般字段不同的是,当LOB字段大小超过4k时,数据库会单独为该LOB字段分配额外的BLOB Segments存储BLOB对象。此时该BLOB字段的UNDO信息也存储在该Segments中,默认其UNDO过期时间为数据库初始化参数UNDO_RETENTION设置值。

LOB字段引起的问题

由于LOB字段结构特点,在高并发系统中LOB字段时常出现导致系统运行缓慢的问题。
具有原因:被删除或更新的BLOB字段所占用空间不会自动批量回收,当所在表有大量的删除、更新操作时,BLOB所在Segments会迅速耗尽空间,新的INSERT需要空间时,会在高水位线上加锁后,回收曾使用但已经过期的BLOB空间,由于该操作效率很低,此时数据库就会有大量的‘enq:HW – contention’等待,相关SQL会由于该等待而串行执行,业务受影响十分严重。

因此LOB字段不适合在有大批量删除、更新操作的并发场合使用。

LOB字段的使用建议

为避免由于LOB该特性造成的的风险,设计和开发阶段对LOB字段使用如下建议:
1:有大批量删除、更新操作,而且有并发插入的表中,不建议使用LOB字段,比如日志表。可以使用多个varchar(4000)字段进行拼接来代替;
2:使用LOB字段时,为LOB字段手工单独指定和表所在表空间不同的表空间;
3:11g使用LOB字段时,建议使用Securefile(默认basefile),如果单条记录显著大于block size,使用compress选项。

附:LOB字段导致enq:HW – contention’应急处理
如果遇到由于LOB字段使用出现大量的‘enq:HW – contention’等待时,应急时可以临时分配更多空间以避免回收影响:
ALTER TABLE <lob_table>
MODIFY LOB (<column_name>) (allocate extent (size <extent size>));

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

0

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关资料

X社区推广