对于目前数据量较大的表,REPORT_AP_STAT_HOUR(2个月有1900万),CLIENT_OFFLINE_HISTORY(2个月有4800万),如果保存超过一年数据将达数亿,对这种级别的数据索引优化已经达不到要求的(15秒之内完成查询),因此需要进行按月分表,使用ORACLE11G的新特性interval按月进行自动分表。
分区表建表语句如下:
CREATE TABLE CLIENT_OFFLINE_HISTORY_IN(
"CLIENT_OFFLINE_ID" NUMBER(20) NOT NULL ,
"AP_ID" NUMBER(20) NULL ,
CONSTRAINT "PK_CLIENT_INTERVAL" PRIMARY KEY ("CLIENT_OFFLINE_ID")
)PARTITION BY RANGE (CREATE_TIME)
INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
(PARTITION part1
VALUES LESS THAN (TO_DATE ('2013-08-01', 'yyyy-MM-dd')))
由于ORACLE不能直接将表修改为分区表,对于已经部署的系统需要先将分区表建立,然后将老表中的数据迁移至分区表。
普通表与分区表之间的数据迁移目前有三种方案:
(1) 使用INSERT INTO SELECT 语句,速度较慢
INSERT INTO CLIENT_OFFLINE_HISTORY_IN SELECT * FROM CLIENT_OFFLINE_HISTORY
(2) 使用expdp/impdp工具,速度较快
查看目录:
SELECT * FROM dba_directories;
创建dir dba权限:
CREATE DIRECTORY DPDATA AS '/home/oracle/dump';
执行导出语句
expdp wlan/wlan1o2o DUMPFILE=history.dmp TABLES=CLIENT_OFFLINE_HISTORY DIRECTORY=dpdata
执行导入语句
impdp wlan/wlan1o2o DIRECTORY=dpdata DUMPFILE=history.dmp TABLES=CLIENT_OFFLINE_HISTORY REMAP_TABLE=CLIENT_OFFLINE_HISTORY:CLIENT_OFFLINE_HISTORY_IN TABLE_EXISTS_ACTION=APPEND
(3) 使用交换分区速度最快,原理迁移不做任何的IO操作只是更改数据字典,限制条件是普通表内数据必须符合分区中的一个分区
ALTER TABLE TEST_INTERVAL_PAR EXCHANGE PARTITION PART1 WITH TABLE TEST_INTERVAL WITHOUT VALIDATION;
具体使用的时候可以根据实际需要进行相应的迁移操作。