我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
为什么数据库存储LOB数据时要选择「行内存储」?
在数据库设计中,我们经常会存储大型对象数据(LOB),比如长文本、图片或文件。Oracle数据库提供了两种存储LOB的方式:行内存储和行外存储。这篇文章会用通俗的语言解释它们的区别,并告诉你为什么在大多数情况下应该选择行内存储。
什么是行内存储和行外存储?
想象一下,数据库中的一张表就像一个Excel表格。每个单元格通常只能放少量数据(比如4000字节以内)。但如果某个单元格需要存储更长的内容(比如一篇文章),数据库就会面临选择:
-
行内存储 (ENABLE STORAGE IN ROW)
- 如果内容不长(≤4000字节),就直接存在单元格里。
- 就像在Excel单元格里直接写短文,查看时一目了然,速度快。
- 如果内容超长,数据库会自动把它移到单独的存储区域(LOBSEGMENT)。
-
行外存储 (DISABLE STORAGE IN ROW)
- 无论内容多短,都强制存到单独的存储区域。
- 就像在Excel单元格里只写一个“附件链接”,每次查看都要点开链接才能看到内容,速度更慢。
为什么行内存储通常是更好的选择?
-
性能更快
- 短数据直接存在表中,读取时不需要额外跳转到其他区域,减少了I/O操作。
- 实验表明,读取行内存储的LOB比行外存储快得多(逻辑I/O次数从5.4万次降到0次,物理I/O也更少)。
-
减少资源消耗
- 行外存储需要维护额外的索引(LOBINDEX)和存储段(LOBSEGMENT),更新和插入操作会更耗时。
- 行内存储避免了这些开销,尤其适合频繁读写短文本的场景(比如商品描述、用户备注等)。
-
利用缓存优势
- 表数据通常会被缓存到内存中,而LOBSEGMENT默认不缓存。
- 行内存储的短LOB可以享受缓存带来的速度提升,而行外存储每次可能都需要磁盘读写。
什么时候用行外存储?
虽然行内存储是默认推荐,但以下情况可能适合行外存储:
- LOB数据通常很大(比如超过4000字节),放表内反而浪费空间。
- 数据不需要频繁读取,或者对读取速度不敏感。
- 有独立缓存LOB数据的特殊需求(但需要额外配置)。
实际例子说明
假设我们有一张表存储文章内容,其中多数文章是短评(<4000字节),少数是长文。
- 如果使用行内存储:短评直接存在表里,读取飞快;长文自动移到外部,不影响效率。
- 如果强制行外存储:即使短评也要额外访问外部存储,效率低下。
总结
- 优先选择行内存储(
ENABLE STORAGE IN ROW),这是Oracle的默认设置。 - 它兼顾了短数据的高效和长数据的灵活性,适合大多数场景。
- 只有在明确需要强制分离LOB数据时,才考虑行外存储。
简单来说:让数据库自动决定小数据放表内、大数据放外部,才是最优解!
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)