我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
白话解读Oracle范围分区
什么是范围分区?
想象一下你有一个超大文件柜,里面塞满了按日期排序的文件。为了快速找到某天的文件,你可以在文件柜上贴标签:
- 第一个抽屉放「2021年之前」的所有文件
- 第二个抽屉放「2021整年」的文件
这就是范围分区的核心思想——按数值范围划分存储空间。
具体如何操作?
用以下SQL建表时,我们明确规定了分区规则:
CREATE TABLE range_example(range_key_column date NOT NULL, -- 分区依据列data varchar2(20)
)
PARTITION BY RANGE (range_key_column)
(PARTITION part_1 VALUES LESS THAN ('2021-01-01'), -- 2021年前数据PARTITION part_2 VALUES LESS THAN ('2022-01-01') -- 2022年前数据
);
注意这两个关键词:
-
LESS THAN
(严格小于):- 2020-12-31 23:59:59 → 进part_1
- 2021-01-01 00:00:00 → 进part_2
就像考试60分及格,59.9分也算不及格
-
国际化日期格式:
使用dd/mm/yyyy
避免语言环境问题。如果用dd-mon-yyyy
,在非英语系统可能因月份缩写不一致(如中文系统不认识"Jan")导致建表失败。
实际效果验证
插入测试数据后查询可见:
-- 分区1数据:2020-12-15 至 2020-12-31
-- 分区2数据:2021-01-01 至 2021-12-31
超出范围怎么办?
如果尝试插入2022年的数据,Oracle会直接报错:
ORA-14400: 插入的分区键无法映射到任何分区
就像试图把2022年的文件塞进标注「仅存放2021年及以前」的抽屉。
解决方案:设置万能分区
通过增加MAXVALUE
分区兜底所有特殊情况:
PARTITION part_3 VALUES LESS THAN (MAXVALUE) -- 接收所有不符合条件的数据
现在这个文件柜变成了:
- 抽屉1:2021年前文件
- 抽屉2:2021年文件
- 抽屉3:其他所有文件(包括2022年后、日期为空等特殊情况)
核心价值
范围分区通过物理隔离不同时间段的数据,使以下操作更高效:
- 查询特定时间段数据时,只需扫描对应分区
- 清理历史数据时,直接删除整个分区
- 维护操作可针对单个分区进行,不影响整体可用性
这种设计特别适合时序类数据(如订单、日志、监控数据),让数据库既保持管理便捷性,又提升查询性能。
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)