本帖最后由 donglin243870 于 2015-7-15 21:10 编辑 问题背景: LOB字段是Oracle数据库用于存储大数据对象的字段类型,包括BLOB、CLOB、NLOB、BFILE; 当LOB字段大小超过4k时,数据库会单独为该LOB字段分配额外的BLOB Segments存储BLOB对象,存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO,代价很是高,因此对于大于4kb的lob字段更新效率很是低; 被删除或更新的BLOB字段所占用空间不会自动批量回收,当所在表有大量的删除、更新操做时,BLOB所在Segments会迅速耗尽空间,新的INSERT须要空间时,会在高水位线上加锁后,回收曾使用但已通过期的BLOB空间,因为该操做效率很低,此时数据库就会有大量的‘enq:HW – contention’等待,相关SQL会因为该等待而串行执行,业务受影响十分严重。所以LOB字段不适合在有大批量删除、更新操做的并发场合使用;oracle 已知解决办法:性能 为避免因为LOB该特性形成的的风险,对LOB字段的使用应遵循以下要求:大数据 1.存储在lobsegment中的lob能够在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(好比几k~几十k)颇有效果,减小物理IOui 2. 有大批量删除、更新操做,并且有并发插入的表中,建议不要使用LOB字段,好比日志表。可使用多个varchar(4000)字段进行拼接来代替;spa 3. 使用LOB字段时,为LOB字段手工单独指定和表所在表空间不一样的表空间; 4. 版本11g使用LOB字段时,建议使用Securefile(默认basefile),若是单条记录显著大于block size,使用compress选项。 5. 将数据存储到文件系统中,数据库字段中存储文件地址,这种方法好像和bfile差很少; 问题: 1. 对于大容量不常常更新的lob除采用上面的解决办法外,还有什么好的方法; 2. 对于大容量的超过4000字节的文本,若是须要常常更新(如:发表文章,帖子后须要修改),采用什么解决方案比较好; 3. 单个字段大容量信息存储你们有些什么好的方法; |