我们的文章会在微信公众号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(高)
聚集因子越低,说明相同范围的数据在物理上存储得越集中;聚集因子越高,说明数据存储得越分散。
一个重要的启示
这个实验告诉我们:单纯看表中有多少数据是不够的,数据的物理存储方式同样重要。
这也就解释了为什么有时候在生产环境运行很快的查询,在测试环境却变得很慢——虽然数据内容相同,但物理存储顺序可能完全不同。
如何提高查询效率?
-
合理设置提取批量(ARRAYSIZE)
- 增大每次提取的行数(比如从15行增加到100行)
- 可以减少重复访问相同数据块的次数
- 对有序数据的提升效果特别明显
-
考虑数据物理顺序
- 对于经常需要范围查询的数据,尽量保持物理存储顺序与逻辑顺序一致
- 可以使用索引组织表(IOT)来强制保持顺序
-
选择正确的查询方式
- 对无序数据,有时候全表扫描反而比使用索引更快
- 要让优化器根据实际情况选择最佳执行计划
总结
数据的物理存储方式就像图书馆的书籍摆放方式:
- 按序号整齐摆放:找书很快
- 随机摆放:找书很慢
虽然书的内容都一样,但查找效率天差地别。因此,在设计数据库时,不仅要关注数据逻辑结构,也要重视物理存储方式,这样才能获得最佳性能。
记住:相同的数据,不同的存放方式,会产生完全不同的性能表现。这是数据库优化中经常被忽视但却至关重要的一点。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)