读书笔记:白话解读Oracle的一种高级功能——列表分区(List Partitioning)

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

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

大家好!今天我们来聊聊数据库中的一种高级功能——列表分区(List Partitioning)。用大白话来说,它就是帮你把数据“分门别类”存放的一种好方法。

它解决什么问题?

想象一下,你有一张巨大的数据表,里面存储了美国各个州的信息。你的应用经常需要按“东北部”、“新英格兰地区”这样的地理区域来查询数据。

如果直接把所有数据堆在一起,每次查询都要扫描整个表,效率很低。而列表分区就像给你的数据表打了许多小格子,每个格子只放特定类型的数据。比如:

  • 格子1(part_1):专门放缅因州(ME)、新罕布什尔州(NH)、佛蒙特州(VT)和马萨诸塞州(MA)的数据。
  • 格子2(part_2):专门放康涅狄格州(CT)、罗得岛州(RI)和纽约州(NY)的数据。

这样,当你需要查询“新英格兰地区”的数据时,数据库只需要去翻看第一个格子就行了,速度飞快,避免了“大海捞针”。


为什么不用其他分区方法?

你可能会想,用范围分区(比如A-Z)或者哈希分区(随机分散)不行吗?

  • 范围分区不行:因为这些州的缩写代码(ME, NH, VT...)在字母表上不是连续的。你没办法划出一个从“ME”到“VT”还能完美避开其他州的范围。
  • 哈希分区也不行:因为它用的是随机算法,你无法控制“NH”这个数据一定会被分到哪个格子里。而我们的需求是精确地把某些州 grouping 在一起。

所以,列表分区是完成这种“自定义分组”需求的最佳选择


一个重要的问题和它的解决方案

如果你试图插入一个不在你列表里的州(比如弗吉尼亚州,VA),数据库会直接报错:“对不起,这个值没有对应的格子,我不知道该放哪!”

这就像你定了规矩“只允许穿红衣服和蓝衣服的人进入A、B两个房间”,结果来了个穿绿衣服的,保安就蒙了,只能把他拦在外面。

那怎么解决呢?
答案是:设置一个“其他”房间(DEFAULT分区)

ALTER TABLE list_example ADD PARTITION part_3 VALUES (DEFAULT);

有了这个“万能收纳箱”,所有不属于之前明确规定的州(如VA, CA, FL等等)的数据,都会被自动放到这个默认分区(part_3)里,系统就不会再报错了。


一个需要注意的“坑”

但是!一旦你设置了“其他”房间(DEFAULT分区),你就不能再增加新的、有明确规则的房间了

比如,后来你想增加一个分区 part_4,专门用来放加利福尼亚州(CA)和新墨西哥州(NM):

ALTER TABLE list_example ADD PARTITION part_4 VALUES('CA', 'NM');
-- 这会失败!报错:当默认分区已存在时,无法添加新分区。

为什么不行?
因为那个“其他”房间里可能已经堆满了各种数据,其中很可能就包含“CA”和“NM”的数据。现在你新定了个规矩说“CA”和“NM”有专属房间了,那原来在“其他”房间里的“CA”和“NM”数据怎么办?数据库无法自动帮你挪过去,所以它干脆禁止你这么操作。

解决办法:

  1. 删除(drop) 默认分区(注意:这会删除里面所有数据,所以操作前一定要备份!)。
  2. 然后添加(add) 你想要的新分区(part_4)。
  3. 最后,再重新创建(add) 一个默认分区(part_3)。

总结

列表分区是一个非常实用的工具,它让你能:

  • 精细化管理数据,根据业务需求自定义分组。
  • 大幅提升查询效率,让数据库只扫描相关的数据分区。

使用时记住两点:

  1. 规划好你的分组逻辑。
  2. 谨慎使用 DEFAULT 分区,因为它虽然方便,但会带来一些管理上的限制。

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-11-21 14:11  认真就输  阅读(9)  评论(0)    收藏  举报