首页 > Linux操作系统 > Linux操作系统 > 海量数据处理_表分区
分区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博客 ” ,链接:https://blog.itpub.net/18922393/viewspace-696777/ ,如需转载,请注明出处,否则将追究法律责任。