当前位置: 首页 > news >正文

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

我们的文章会在微信公众号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)

http://www.wxhsa.cn/company.asp?id=3627

相关文章:

  • Rcc_APBPeriphClockCmd()
  • 故障处理:ORA-19809: limit exceeded for recovery files
  • ORA-01555系列:二、ORA-01555的场景分析与解决方案
  • PySimpleGUI常用控件
  • 25.09.14 与其感慨路难行,不如马上出发
  • GCC工具链应用学习笔记
  • 初始化 MCP 环境 创建 MCP Server (一)
  • 博客园格式设置
  • [总结/备赛]备战 CSP-S 2025 初赛总结
  • win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?
  • 逆序数及其应用
  • 豆豆守护如何下载?
  • Java运行时jar时终端输出的中文日志是乱码
  • ZK2真空发生器日常清理
  • Nacos服务注册与发现
  • 马的遍历
  • 20231310王宏邦《密码系统设计》第1周
  • 新学期第一次随笔:慢慢学,总会有进步
  • 详细介绍:【C语言】第四课 指针与内存管理
  • 知识点错题整理
  • 202311_陇剑杯预赛_tcpdump
  • Linux学习记录(六):添加/删除用户
  • python 链式调用 合并 __setattr__ __getattribute__ in nested object()
  • 分享一个稳定好用的免费云服务——阿贝云体验
  • 年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解
  • 接口测试---PyMysql
  • My First Blog
  • 设置基础软件仓库时出错
  • linux c应用性能与内存泄露问题排查工具
  • 深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略