ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 海量数据处理_表分区

海量数据处理_表分区

原创 Linux操作系统 作者:redhouser 时间:2011-05-31 15:37:16 0 删除 编辑

分区act_log表:

执行情况参考:
数据:2亿条
insert as select parallel 8=〉undo size:0 time:524 sec
gather_table_stats=>undo size:0 time:360 sec
create index parallel 8=>undo size:0 time:400 sec

1,创建分区表:
注意:用生成的sql替换创建分区表ddl中的分区子句,并注释此查询语句。
SELECT *
  FROM (SELECT /*+ parallel(t,8) */
         'partition p' || to_char(action_date, 'YYYYMM') ||
         ' values less than (to_date(''' ||
         to_char(add_months(to_date(to_char(action_date, 'YYYYMM') || '01',
                                    'YYYYMMDD'),
                            1),
                 'YYYYMMDD') || ''',''YYYYMMDD'')),'
          FROM act_log t
         GROUP BY to_char(action_date, 'YYYYMM')
        UNION
        SELECT 'partition p' || to_char(add_months(SYSDATE, 1), 'YYYYMM') ||
               ' values less than (to_date(''' ||
               to_char(to_date(to_char(add_months(SYSDATE, 2), 'YYYYMM') || '01',
                               'YYYYMMDD'),
                       'YYYYMMDD') || ''',''YYYYMMDD'')),'
          FROM dual
        UNION
        SELECT 'partition p' || to_char(add_months(SYSDATE, 2), 'YYYYMM') ||
               ' values less than (to_date(''' ||
               to_char(to_date(to_char(add_months(SYSDATE, 3), 'YYYYMM') || '01',
                               'YYYYMMDD'),
                       'YYYYMMDD') || ''',''YYYYMMDD'')),'
          FROM dual
        UNION
        SELECT 'partition pmax values less than (maxvalue)' FROM dual)
 ORDER BY 1;
exit;

create table ACT_LOG_PART
(
  USER_ID     INTEGER not null,
  ACTION_DATE TIMESTAMP(6) not null,
  TYPE        VARCHAR2(50 BYTE) not null,
  DETAIL      VARCHAR2(4000 BYTE) not null,
  CHNL        VARCHAR2(1 BYTE) default '1'
) partition by range(action_date)(
partition p201101 values less than (to_date('20110201','YYYYMMDD')),
partition p201102 values less than (to_date('20110301','YYYYMMDD')),
partition p201103 values less than (to_date('20110401','YYYYMMDD')),
partition p201104 values less than (to_date('20110501','YYYYMMDD')),
partition pmax values less than (maxvalue)
);


2,迁移
--time,undo space,redo space
alter table act_log_part nologging;

insert /*+ append,parallel(tp,8) */ into ACT_LOG_PART tp
select /*+ parallel(t,8) */ * from act_log t;
commit;

alter table act_log_part logging;

analyze table:
begin
  dbms_stats.gather_table_stats(ownname => user,tabname => 'ACT_LOG_PART',degree => 8);
end;

3,create index
create index IDX_ACT_LOG_USERID_ACTDATE on ACT_LOG_PART (USER_ID,ACTION_DATE)
local
parallel 8
nologging;

alter index IDX_ACT_LOG_USERID_ACTDATE logging noparallel;


4,exchange table
rename action_LOG to action_LOG_bak;

rename ACT_LOG_PART to act_log;

分区act_log表完成。


5,分区维护,请数据库管理人员手工维护,维护说明如下:
--每月月初,删除包含13个月前数据的分区,并新增下下个月的分区。
--分区命名规则为:'p' + 'YYYYMM',其中包含'YYYYMM'月份的数据。
--如:partition p200901 values less than (to_date('20090201','YYYYMMDD')),

--删除分区:
--建议在删除分区前备份该分区,如采用外部表方式备份。
--alter table act_log drop partition partition_name;
--如:当前是2010年3月,要删除的分区为:p200902,删除命令为:
--alter table act_log drop partition p200902;

--增加分区:
--alter table act_log split partition pmax at (split_date)
--into (partition l_partition_name, partition pmax);
--如:当前是2010年3月,要增加5月份的分区:p201005,增加命令为:
--alter table act_log split partition pmax at (to_date( '20100601','YYYYMMDD'))
--into (partition p201005, partition pmax);


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18922393/viewspace-696777/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-26

  • 博文量
    211
  • 访问量
    810129