需求:为一个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/
本文详细介绍了如何通过新建表、导入数据、修改表名的方法为Range分区表添加Hash子分区,以避免产生热点块。具体步骤包括创建包含Hash分区的新表、设置分区范围、分配表空间等,并最终完成数据迁移和表结构调整。
1358

被折叠的 条评论
为什么被折叠?



