需求:为一个range分区表添加hash子分区,避免产生热点块
解决方案:截止Oracle 11g还没有能够直接实现上述需求的命令(如果谁有更方便的办法,请不吝赐教啊),所以计划采取建新表->导数据->改表名的方法实现上述需求。评估现场数据量,因为有历史数据清除机制,所以全表现有10个分区,共有百万条记录,插入时间在可承受范围内。
操作步骤如下
- create table T_NEW
- (
- id NUMBER(15),
- name VARCHAR2(40),
- age NUMBER(3),
- regist_time DATE not null,
- )
- partition by range (regist_time)
- SUBPARTITION BY HASH(name) SUBPARTITIONS 12
- (
- partition PART20140721 values less than (TO_DATE(' 2014-07-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140722 values less than (TO_DATE(' 2014-07-22 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140723 values less than (TO_DATE(' 2014-07-23 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140724 values less than (TO_DATE(' 2014-07-24 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140725 values less than (TO_DATE(' 2014-07-25 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140727 values less than (TO_DATE(' 2014-07-27 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140728 values less than (TO_DATE(' 2014-07-28 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140729 values less than (TO_DATE(' 2014-07-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140730 values less than (TO_DATE(' 2014-07-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140731 values less than (TO_DATE(' 2014-07-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140801 values less than (TO_DATE(' 2014-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140802 values less than (TO_DATE(' 2014-08-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140803 values less than (TO_DATE(' 2014-08-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140804 values less than (TO_DATE(' 2014-08-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- ),
- partition PART20140805 values less than (TO_DATE(' 2014-08-05 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
- tablespace TS_TEST
- pctfree 10
- initrans 1
- maxtrans 255
- storage
- (
- initial 1M
- next 1M
- minextents 1
- maxextents unlimited
- pctincrease 0
- )
- );
-
- ALTER TABLE T_NEW NOLOGGING;
- INSERT INTO T_NEW SELECT * FROM T;
- ALTER TABLE T_NEW LOGGING;
-
- RENAME T TO T_OLD;
- RENAME T_NEW TO T;
- -- Add comments to the columns
- comment on column T.regist_time
- is '用户注册时间';
-
- -- Create/Recreate indexes
- create index IND_T_NAME on T (NAME)
- local;
- create index IND_T_REGISTTIME on T (REGIST_TIME)
- local;
-
- EXEC dbms_stats.gather_table_stats('USER','T');
- DROP TABLE T_OLD;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28998293/viewspace-1242524/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28998293/viewspace-1242524/