Partition-方案一. 通过 Export/import 方法

来源:互联网 发布:python编码汉字互转 编辑:程序博客网 时间:2024/06/16 19:10

方案一. 通过 Export/import 方法
可以任选如下四种方法的一种来对非分区表进行分区(维护时间由大到小):
A) 通过 Export/import 方法
B) 通过 Insert with a subquery 方法
C) 通过 Partition Exchange 方法
D) 通过 DBMS_REDEFINITION 方法

以上四种方法都会从一个已经存在的非分区表创建出一个分区表。尽管官方已经对这四种方法的维护时间预期做了倒序排列,但实际维护时间针对不同情况有所不同。

SQL> select count(*) from WZ_REAL_DATA;  COUNT(*)----------  45506888SQL> select sum(bytes)/1024/1024/1024 G from dba_segments where segment_name='WZ_REAL_DATA';     G----------1.62988281SQL> desc WZ_REAL_DATA Name                       Null?    Type ----------------------------------------- -------- ---------------------------- STIME                       NOT NULL DATE PI_AI_POINT                   NOT NULL VARCHAR2(30) FVALUE                         NUMBER(16,4)SQL> select min(stime) from WZ_REAL_DATA;MIN(STIME---------01-MAR-12SQL> select max(stime) from WZ_REAL_DATA;MAX(STIME---------18-MAY-15

查看表WZ_REAL_DATA是否为分区表:

SQL> select table_name,tablespace_name from user_tables where table_name='WZ_REAL_DATA';TABLE_NAME               TABLESPACE_NAME------------------------------ ------------------------------WZ_REAL_DATA               XDWZJSSQL> select table_name,partition_name,partition_position from user_tab_partitions where table_name='WZ_REAL_DATA';no rows selectedSQL> 

发现4500万数据的大表竟然不是分区表,并且此表大小快超过2G了,oracle建议对大于2G的表进行分区;
下面开始进行分区实验:

方案一. 通过 Export/import 方法
这种方法的实现是先 export 一个非分区表,创建一个新的分区表,然后 import 数据到新创建的分区表中。
1) Export 您的非分区表:

$ exp xdwz/qizhengtao tables=WZ_REAL_DATA file=WZ_REAL_DATA.dmp[oracle@localhost ~]$ exp xdwz/qizhengtao tables=WZ_REAL_DATA file=WZ_REAL_DATA.dmp log=WZ_REAL_DATA.logExport: Release 11.2.0.4.0 - Production on Fri May 6 16:09:37 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsExport done in ZHS16GBK character set and AL16UTF16 NCHAR character setAbout to export specified tables via Conventional Path .... . exporting table                   WZ_REAL_DATA   45506888 rows exportedExport terminated successfully without warnings.[oracle@localhost ~]$ dateFri May  6 16:13:57 CST 2016

导出表4min 20sed
2) Drop 掉该非分区表:
SQL> !date
Fri May 6 16:16:08 CST 2016
查下原表的DDL建表语句:

SQL> select dbms_metadata.get_ddl('TABLE','WZ_REAL_DATA','XDWZ') from dual;DBMS_METADATA.GET_DDL('TABLE','WZ_REAL_DATA','XDWZ')--------------------------------------------------------------------------------  CREATE TABLE "XDWZ"."WZ_REAL_DATA"   (    "STIME" DATE NOT NULL ENABLE,    "PI_AI_POINT" VARCHAR2(30) NOT NULL ENABLE,    "FVALUE" NUMBER(16,4),     CONSTRAINT "PK_WZ_REAL_DATA1" PRIMARY KEY ("STIME", "PI_AI_POINT")  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS  STORAGE(INITIAL 1811939328 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)  TABLESPACE "XDWZJS"  ENABLE   ) SEGMENT CREATION IMMEDIATE  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING  STORAGE(INITIAL 1750073344 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)  TABLESPACE "XDWZJS"

删除表:

SQL> drop tablZ_REAL_DATA;Table dropped.

删除表非常快,大概2S钟;

3) 重新创建该表成为一个分区表:
创建分区表

CREATE TABLE WZ_REAL_DATA   (STIME DATE NOT NULL,    PI_AI_POINT VARCHAR2(30) NOT NULL,    FVALUE NUMBER(16,4),     CONSTRAINT PK_WZ_REAL_DATA1 PRIMARY KEY (STIME,PI_AI_POINT))  partition by range (stime) (partition p1_2012 values less than (to_date('2013-01-01','yyyy-mm-dd')),  partition p1_2013 values less than (to_date('2014-01-01','yyyy-mm-dd')),  partition p1_2014 values less than (to_date('2015-01-01','yyyy-mm-dd')),  partition p1_2015 values less than (to_date('2016-01-01','yyyy-mm-dd')),  partition p_max values less than (maxvalue)) tablespace XDWZJS;

4) 通过 import 的 ignore=y 方式来还原备份的数据:

[oracle@localhost ~]$ export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"[oracle@localhost ~]$ imp xdwz/qizhengtao tables=WZ_REAL_DATA file=WZ_REAL_DATA.dmp log=WZ_REAL_DATA_imp.log ignore=y buffer=102400000 commit=y

如果表比较大,建议放后台执行,我这导入dmp文件1436.9375M用了16min
ignore=y 语句会让 import 忽略掉表的创建,直接加载所有数据。
如果使用 Data Pump export/import(expdp/impdp)可以采用 impdp 的 table_exists_action 选项,例如 table_exists_action = APPEND 或者 table_exists_action = REPLACE。
确认表WZ_REAL_DATA是否已经改为分区表:

SQL> select table_name,tablespace_name from user_tables where table_name='WZ_REAL_DATA';TABLE_NAME               TABLESPACE_NAME------------------------------ ------------------------------WZ_REAL_DATASQL>  select table_name,partition_name,partition_position from user_tab_partitions where table_name='WZ_REAL_DATA';TABLE_NAME               PARTITION_NAME              PARTITION_POSITION------------------------------ ------------------------------ ------------------WZ_REAL_DATA               P1_2012                           1WZ_REAL_DATA               P1_2013                           2WZ_REAL_DATA               P1_2014                           3WZ_REAL_DATA               P1_2015                           4WZ_REAL_DATA               P_MAX                           5SQL> 

至此普通表转分区表完成。

1 0