读书笔记:为什么数据在磁盘上的存放顺序如此重要?

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

为什么数据在磁盘上的存放顺序如此重要?

想象一下,你有一个按照序号排列的文件夹柜。当你需要查找编号连续的文件时(比如从20000号到40000号),如果这些文件都放在相邻的抽屉里,你只需要打开几个抽屉就能快速找到所有文件。这就是数据物理有序存储的优势。

但是,如果有人把这些文件全部打乱,随机放在不同的抽屉里。那么查找同样范围内的文件时,你就需要不停地开关各个抽屉,效率大大降低。这就是数据物理无序存储的问题。

实际测试证明了什么?

我们通过一个具体的测试来展示这种差异:

有序表(COLOCATED):数据基本按主键顺序存储

  • 查询耗时:0.21秒
  • 逻辑读取次数:14,495次

无序表(DISORGANIZED):数据完全打乱存储

  • 查询耗时:0.41秒
  • 逻辑读取次数:106,830次

虽然两个表包含完全相同的数据,但查询性能却相差近一倍!逻辑读取次数更是相差7倍多。

为什么会产生这种差异?

关键原因在于数据聚集因子(Clustering Factor)

  • 有序表的聚集因子:1190(低)
  • 无序表的聚集因子:99929(高)

聚集因子越低,说明相同范围的数据在物理上存储得越集中;聚集因子越高,说明数据存储得越分散。

一个重要的启示

这个实验告诉我们:单纯看表中有多少数据是不够的,数据的物理存储方式同样重要

这也就解释了为什么有时候在生产环境运行很快的查询,在测试环境却变得很慢——虽然数据内容相同,但物理存储顺序可能完全不同。

如何提高查询效率?

  1. 合理设置提取批量(ARRAYSIZE)

    • 增大每次提取的行数(比如从15行增加到100行)
    • 可以减少重复访问相同数据块的次数
    • 对有序数据的提升效果特别明显
  2. 考虑数据物理顺序

    • 对于经常需要范围查询的数据,尽量保持物理存储顺序与逻辑顺序一致
    • 可以使用索引组织表(IOT)来强制保持顺序
  3. 选择正确的查询方式

    • 对无序数据,有时候全表扫描反而比使用索引更快
    • 要让优化器根据实际情况选择最佳执行计划

总结

数据的物理存储方式就像图书馆的书籍摆放方式:

  • 按序号整齐摆放:找书很快
  • 随机摆放:找书很慢

虽然书的内容都一样,但查找效率天差地别。因此,在设计数据库时,不仅要关注数据逻辑结构,也要重视物理存储方式,这样才能获得最佳性能。

记住:相同的数据,不同的存放方式,会产生完全不同的性能表现。这是数据库优化中经常被忽视但却至关重要的一点。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-09-14 15:02  认真就输  阅读(5)  评论(0)    收藏  举报