我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
Oracle分区黑科技:间隔引用分区与虚拟列分区详解
间隔引用分区:让分区管理全自动
想象一下,你的订单表需要按年份分区,但你不想每年手动添加新分区。间隔引用分区就是为此而生的"智能管家"!
传统分区的痛点
过去,当2022年的数据到来时,你需要手动执行:
ALTER TABLE orders ADD PARTITION part_2022 ...;
间隔引用分区的解决方案
现在,只需在创建表时声明规则,Oracle就会自动管理分区:
-- 父表:设置按年自动分区
CREATE TABLE orders (order# NUMBER PRIMARY KEY,order_date TIMESTAMP,data VARCHAR2(30)
) PARTITION BY RANGE (order_date)
INTERVAL (NUMTOYMINTERVAL(1,'year')) -- 关键!自动按年创建分区
(PARTITION part_2020 VALUES LESS THAN ('2021-01-01'));-- 子表:自动继承父表的分区规则
CREATE TABLE order_line_items (order# NUMBER,line# NUMBER,data VARCHAR2(30),CONSTRAINT fk_orders FOREIGN KEY(order#) REFERENCES orders
) PARTITION BY REFERENCE(fk_orders); -- 关键!引用父表分区
实际效果演示
初始状态:插入2020-2021年数据
INSERT INTO orders VALUES (1, '2020-06-01', '订单1');
INSERT INTO order_line_items VALUES(1, 1, '明细1');
此时查看分区:
ORDERS分区: [part_2020] [part_2021]
ORDER_LINE_ITEMS分区:[part_2020] [part_2021]
魔法时刻:插入2022年数据
INSERT INTO orders VALUES (3, '2022-06-01', '订单3');
INSERT INTO order_line_items VALUES (3, 1, '明细3');
系统自动创建新分区:
ORDERS分区: [part_2020] [part_2021] [SYS_P1640(自动创建)]
ORDER_LINE_ITEMS分区:[part_2020] [part_2021] [SYS_P1640(自动创建)]
优势总结
- 全自动管理:无需人工干预,系统自动创建所需分区
- 父子表同步:子表完全跟随父表的分区变化
- 命名规范:自动生成的分区可以重命名为有意义的名称
虚拟列分区:用"计算字段"实现智能分区
业务场景
假设你有一个预订编码表,编码规则是:
- 第一个字母代表地区:A/C→东北(NE),B→西南(SW),D→西北(NW)
- 示例:
A123(东北地区)、B456(西南地区)
传统方法的困境
如果想按地区分区,通常需要:
- 新增一个
region字段存储地区代码 - 每次插入数据时手动计算并填充
- 面临数据不一致的风险
虚拟列分区的优雅方案
CREATE TABLE res (reservation_code VARCHAR2(30),-- 虚拟列:不占存储空间,自动计算region AS (DECODE(SUBSTR(reservation_code,1,1),'A','NE', 'C','NE', -- A或C都是东北'B','SW', -- B是西南 'D','NW' -- D是西北))
) PARTITION BY LIST (region) ( -- 按虚拟列分区!PARTITION NE VALUES('NE'),PARTITION SW VALUES('SW'), PARTITION NW VALUES('NW')
);
实际效果
插入测试数据:
INSERT INTO res (reservation_code) VALUES
('A123'), ('B456'), ('C789'), ('D012');
数据自动进入正确分区:
NE分区:A123(NE), C789(NE)
SW分区:B456(SW)
NW分区:D012(NW)
虚拟列分区的强大之处
- 零存储开销:虚拟列不占用实际存储空间
- 实时计算:每次查询时动态计算,保证数据一致性
- 灵活表达式:支持复杂SQL函数和计算逻辑
- 业务逻辑封装:分区规则与业务逻辑完美结合
技术对比总结
| 特性 | 间隔引用分区 | 虚拟列分区 |
|---|---|---|
| 适用场景 | 时间序列数据的自动分区 | 基于业务规则的分区 |
| 核心优势 | 全自动管理,父子表同步 | 零冗余,业务逻辑内置 |
| 技术亮点 | INTERVAL + REFERENCE组合 |
虚拟列+分区表达式 |
实际应用建议
选择间隔引用分区当:
- 处理时间序列数据(订单、日志等)
- 需要父子表分区保持严格一致
- 希望减少人工分区维护工作
选择虚拟列分区当:
- 分区依据需要从原始数据计算得出
- 业务规则复杂,无法直接使用现有字段
- 希望保持数据模型简洁,避免冗余字段
这两种分区技术代表了Oracle在数据管理自动化方面的重大进步,让DBA从繁琐的手工维护中解放出来,更加专注于业务价值创造。
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)