Oracle普通表按月转分区表,通过PLSQL包一键生成分区表
作者简介
- 作者:LuciferLiu,中国DBA联盟(ACDU)成员。
- 目前从事Oracle DBA工作,曾从事 Oracle 数据库开发工作,主要服务于生产制造,汽车金融等行业。
- 现拥有Oracle OCP,OceanBase OBCA认证,擅长Oracle数据库运维开发,备份恢复,安装迁移,Linux自动化运维脚本编写等。
前言
- 分区表作为Oracle三大组件之一,在Oracle数据库中,起着至关重要的作用。
分区表有什么优点?
- 普通表转分区表:应用程序无感知,DML 语句无需修改即可访问分区表。
- 高可用性:部分分区不可用不影响整个分区表使用。
- 方便管理:可以单独对分区进行DDL操作,列入重建索引或扩展分区,不影响分区表的使用。
- 减少OLTP系统资源争用:因为DML分布在很多段上进行操作。
- 增强数据仓库的查询性能:可按时间进行分区查询,加速查询。
在运维开发过程中,发现有部分应用厂商在建表之初并未考虑到数据体量的问题,导致很多大表都没有建成分区表。在系统运行过程中,这些表的数据量一直在增大,当达到一定体量时,我们就需要考虑对其进行分区表转换,以提高数据库的性能。那么,如何操作呢?
一、介绍
- 普通表转换为分区表,Oracle给我们提供了哪些方式呢?
- 数据泵导入
- 子查询方式插入
- 分区交换
- 在线重定义
- ALTER TABLE…MODIFY…方式(12.2之后支持)
以上几种方式中,我比较常用的是:数据泵导入,子查询插入,在线重定义。这三种方式的共同点都是 需要提前创建分区表结构的中间表或者目标表。
二、脚本
- 在长时间的重复性工作中,“懒癌”发作的我就想着是否能通过自动化的方式构建分区表的建表语句呢?然后我发现了 梁敬彬大佬的 普通表自动转化为按月分区表的脚本。
经加工和提炼,将以上脚本修改为契合自己使用的脚本:
- 用于生成CTAS完整分区表建表语句:ctas_par.prc
- 用于CTAS直接转换为分区表:par_tab_deal.pkg
- par_tab_deal.pkg 的使用方式为:
1 | --创建日志表 PART_TAB_LOG |
- ctas_par.prc 的使用方式:
1 | --直接执行输出即可 |
三、应用
1 创建测试表T1
1 | --删除t1表 |

2 创建procedure
- 执行以上脚本创建procedure:


1 | select 'alter '||object_type||' '||owner||'.'||object_name||' compile;' |

注意:确认procedure已成功创建。
3 执行procedure
- 执行procedure生成CTAS创建分区表语句:
- 表名:T1
- 分区键:CREATED_DATE
- 建立分区月数:24
- 分区所在表空间:USERS
1 | alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"; |

- 执行脚本如下:
1 | --分区表获取分区列最小记录日期:2015-01-01 00:00:00 |
如果只是需要分区表的建表语句,这里已经可以很简单的拼接出来:
1 | create table T1 |
4 CTAS创建分区表
- 实际执行前,需要先将原表T1进行rename。
1 | alter table lucifer.T1 RENAME TO T1_01; |

注意:如需创建分区表结构,无需修改以上脚本;如需直接创建分区表包含数据,需要将 where 1 = 2 修改为 where 1 = 1。
- 确保当前表T1已经rename为T1_01,执行CTAS创建分区表:

- 查看分区表结构:

注意:由于CTAS不会继承 注释,默认值,因此需要手动比对是否缺失。
1 | COMMENT ON TABLE T1 IS ''; |
- 重命名原表的索引和约束
1 | --重命名索引 |

- 分区表新建本地索引
1 | create index T1_CREATED_DATE_IDX on T1 (CREATED_DATE) tablespace users; |

- 查询分区表
通过以下查询可以发现,数据已被按月分到对应分区下:
1 | SELECT COUNT(1) FROM t1; |

至此,脚本已经介绍完毕。
至于如何灵活应用脚本来转换分区表,请关注我接下来的文章,将分别介绍转换分区表的几种方式。
脚本获取方式:GitHub 持续保持更新中🔥
本次分享到此结束啦~
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
技术交流可以 关注公众号:Lucifer三思而后行

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 三笠の博客!