关于ORACLE表分区实践

上一篇讲了很多关于分区的技术,但是怎么做分区呢,怎么管理分区呢,还需要细细道来。

对于交易流水来说,不管数据量有多大,它一定是按天进来的,这个看实际的分区粒度,分区不是越大越好,也不是越小越高,主要看每个分区的实际数据量的大小,如果一天的数据都有上百万,而查询要求只要看当天的,而且查询比较频繁,那按天做分区,创建7个分区,超过一定天数的,就可以把这个分区的数据移走,以减轻系统负担,对于我现在的情况来说,我一个月的数据量,还是可以处理的,我就建12个分区,以月份为分区键。

 

还有一个问题就是,如果我在系统建设之初,如果想到这些就好了直接在建表脚本里创建分区就好了,数据库可以自己管理数据,它知道应该把新加进来的数据往那里放,可是,最初没有规划,现在数据量已经非常大了,那我要怎么办呢?

如果有一表先是没有分区,像这个样子:

CREATE TABLE PROBLEM_TICKETS
(
    PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,

    tran_date  date

)

 

我现在希望把它建成一个分区表,像下面一样

CREATE TABLE PROBLEM_TICKETS
(
    PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,

    tran_date  date ,

    par             VARCHAR2(2)     --分区段,记交易月份
)
PARTITION BY LIST (par)
(
      PARTITION P_01   VALUES ('01')  TABLESPACE          PROB_TS01,

      PARTITION P_02   VALUES ('02')  TABLESPACE          PROB_TS02, 

      PARTITION P_03   VALUES ('03')  TABLESPACE          PROB_TS03, 

      PARTITION P_04   VALUES ('04')  TABLESPACE          PROB_TS04, 

      PARTITION P_05   VALUES ('05')  TABLESPACE          PROB_TS05, 

      PARTITION P_06   VALUES ('06')  TABLESPACE          PROB_TS06, 

      PARTITION P_07   VALUES ('07')  TABLESPACE          PROB_TS07, 

      PARTITION P_08   VALUES ('08')  TABLESPACE          PROB_TS08, 

      PARTITION P_09   VALUES ('09')  TABLESPACE          PROB_TS09, 

      PARTITION P_10   VALUES ('10')  TABLESPACE          PROB_TS10, 

      PARTITION P_11   VALUES ('11')  TABLESPACE          PROB_TS11, 

      PARTITION P_12   VALUES ('12')  TABLESPACE          PROB_TS12

);

大家一定注意到了,为什么我的新表加了一个字段par,这是我用于建分区的键,没有办法,我的表是按交易日期来做的,而分区的KEY又不可以通过函数来做,那只好加一个字段,用于让ORACLE知道这些数据应该放到那里去。

然后执行下下update PROBLEM_TICKETS set par=to_char(tran_date,'MM');

这样数据有有KEY了,可以往下做了。

 

然后建一张新表,一张带分区的表,这张表做数据转换,即先把旧表的数据放过来,放过来的时候,数据就被分区了,然后再从这个表,把数据拿回去,就可以了。

CREATE TABLE PROBLEM_TICKETS_NEW
(
    PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,

    tran_date  date ,

    par             VARCHAR2(2)     --分区段,记交易月份
)
PARTITION BY LIST (par)
(
      PARTITION P_01   VALUES ('01')  TABLESPACE          PROB_TS01,

      PARTITION P_02   VALUES ('02')  TABLESPACE          PROB_TS02, 

      PARTITION P_03   VALUES ('03')  TABLESPACE          PROB_TS03, 

      PARTITION P_04   VALUES ('04')  TABLESPACE          PROB_TS04, 

      PARTITION P_05   VALUES ('05')  TABLESPACE          PROB_TS05, 

      PARTITION P_06   VALUES ('06')  TABLESPACE          PROB_TS06, 

      PARTITION P_07   VALUES ('07')  TABLESPACE          PROB_TS07, 

      PARTITION P_08   VALUES ('08')  TABLESPACE          PROB_TS08, 

      PARTITION P_09   VALUES ('09')  TABLESPACE          PROB_TS09, 

      PARTITION P_10   VALUES ('10')  TABLESPACE          PROB_TS10, 

      PARTITION P_11   VALUES ('11')  TABLESPACE          PROB_TS11, 

      PARTITION P_12   VALUES ('12')  TABLESPACE          PROB_TS12

);

修改一下下面的过程块,把引号里的'SCHEMA'改成实际的用户名,'OLD_TABLE'表名改成实际的源表名,'NEW_TABLE'改成是中间表名,执行下面的过程。

declare
begin
--1.检查该表OLD_TABLE表不满足重定义的条件

DBMS_REDEFINITION.CAN_REDEF_TABLE('SCHEMA','OLD_TABLE');

--2.创建修改后的新表NEW_TABLE  这一步就是上面建临时表的过程
--在用一个方案中建立一个空的中间表,根据重定义后你期望得到的结构建立中间表。比如:采用分区表,增加了COLUMN等


--3.如果映射方法没有提供,则认为所有包括在中间表中的列用于表的重定义。如果给出了映射方法,则只考虑映射方法中给出的列。如果----没有给出重定义方法,则认为使用主键方式

DBMS_REDEFINITION.START_REDEF_TABLE('SCHEMA','OLD_TABLE','NEW_TABLE');


--4.进行一次数据同步(其实是一次物化视图的刷新)

dbms_redefinition.SYNC_INTERIM_TABLE('SCHEMA','OLD_TABLE','NEW_TABLE');

--5.执行完FINISH_REDEF_TABLE()过程后,原始表重定义后具有了中间表的属性、索引、约束、授权和触发器。中间表上disabled

--的约束在原始表上处于enabled状态

DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCHEMA','OLD_TABLE','NEW_TABLE');

end;

 

执行完了以后,查看一下源表,看建表脚本是不是已经带了分区了,如果有的话,那恭喜你,分区成功了。

 

至于分区的好不好呢,你可以通过下面的SQL语句,查看一下,你每个分区的多少数据量
select * FROM USER_TAB_PARTITIONS ORDER BY TABLE_NAME,PARTITION_NAME;

 

正常的情况下呢,每个分区都有数据,并且数据分布均匀的话呢,算是分区策略比较成功,如果有些分区就没有用呢,那就有问题了,具体问题具体对待。分区是需要管理的,分区并不是一劳永逸的解决了问题,因为以我现在的分区为例,如果数据跨年了,那数据就会重复使用分区,那么就要定时去备份清理分区的数据。具体操作参考上一篇《关于ORACLE分区表的概念及操作》。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介:Oracle 11G 完整的课程体系,从安装到入门到项目实战开发,整个学习过程,都以实践操作为主,大量的案例,实例,作业,来保证学习,练习,直到具备数据分析师,掌握SQL部分,能达到数据库开发工程师的能力要求与水平,SQL查询,数据库对象,索引,视图,分区,优化等等实现从事数据分析师所具备的的数据处理能力,结合存储过程开发与使用,能更好的结合业务需求来完成对指标的统计与分析。 课程收益你将获得:    数据分析师SQL实战    掌握Oracle数据库全部技能    数据分析师入门操作    数据库开发工程师    独立开发数据库需求    SQL纯实战应用    具备数据处理,数据存储技能    具备数据仓库架构师思维与应用 1、建议每天保证2个小时学习时间,加以练习实操2、每节课后的练习案例动手实践,方能记忆深刻3、学完知识点后举一反三,应用到实际工作中 课程亮点:Oracle全集包含服务器搭建,客户端使用,入门步骤,SQL各查询实现,条件查询,分组,聚合函数,正则达式,高级函数,连接查询,多查询,子查询,数据插入,更新,删除,数据库对象,如,视图,索引,同义词,分区,存储过程,存储过程大量案例,项目开发等等内容丰富,各知识点都配置相应的作业及解答过程,真正实例与案例操作,学会Oracle各种操作,满足实际业务工作需要,真正做到事半功倍,以实践工作出发完成各知识点的学习与应用,掌握数据库相关的技能 适合人群: 数据分析师,数据库开发人员,技能提升,数据库应用,在校学生,零基础入门,项目开发,初,中,高级数据库开发工 程师,ETL开发,数据仓库架构,数据运维,企业开发,数据管理,数据质量等。 老师介绍:SUN老师高级数据分析专家,有着丰富的BI项目开发工作经验,具备数仓各方面的数据治理,指标开发,业务梳理,口径开发,曾相继在中国移动,亚信,文思任职高级项目开发,专业领域BI,数据分析,维度与指标展示,数仓流程开发,可视化等相关技术 ,有完备的数据分析理论知识与应用,在数据分析,数据处理,数据可视化数据建模等应用,指标统计,维度分析,多维分析等有深入研究,具备更严谨的实践技能操作。 课程大纲:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值