ITPub博客

首页 > 数据库 > Oracle > 如何将一个普通的非分区表进行分区3 Partition Exchange 方法

如何将一个普通的非分区表进行分区3 Partition Exchange 方法

原创 Oracle 作者:oracle11111 时间:2025-03-03 08:52:53 0 删除 编辑

如何将一个普通的非分区表进行分区3  Partition Exchange 方法


ALTER TABLE EXCHANGE PARTITION 可以通过交换数据和索引 segment 来将一个分区(或子分区)转换成一个非分区表,

也可以将一个非分区表转换成一个分区表的分区(或子分区)。

 除了需要更新索引以外,ALTER TABLE ... EXCHANGE PARTITION 命令是一个字典操作不需要数据移动。

 更多关于此方法的信息参见 Oracle 联机文档(比如 11.2)和 Note 198120.1。



此方法简要步骤如下:


1) 根据所需的分区来创建新的分区表

2) 保持需要交换的非分区表与分区表的分区有相同的结构,并且确保您需要交换的非分区表具有您想要交换的内容

3) 执行:Alter table exchange partition partition_name with table exchange table



注意在交换过程中,所有交换的数据必须满足分区表的分区定义,否则如下错误将抛出:ORA-14099: all rows in table do not qualify for specified partition.


这是因为默认情况下分区交换是有校验的。


示例:


本例创建了与分区表 p_emp 的分区相同结构的交换表。


CREATE TABLE tt (

a NUMBER, y number,

name VARCHAR2(100),date_used DATE)

PARTITION BY RANGE (date_used)

(PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE('10/05/2015', 'DD/MM/YYYY')),

PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE('15/05/2015', 'DD/MM/YYYY')),

PARTITION unpar_table_16 VALUES LESS THAN (TO_DATE('15/05/2025', 'DD/MM/YYYY')));



SQL> SELECT * FROM unpar_table;


A     Y NAME       DATE_USED

---------- ---------- --------------- ---------

46   285 244164022       02-NOV-25

46   286 228081079       03-NOV-25

46   287 878105919       04-NOV-25

46   288 -1254518988     05-NOV-25

46   289 1956572968      06-NOV-25

46   290 348265456       07-NOV-25

46   291 48337066       08-NOV-25

46   292 1302255962      09-NOV-25

46   293 341976019       10-NOV-25

46   294 1167335415      11-NOV-25

46   295 -1167085671     12-NOV-25


A     Y NAME       DATE_USED

---------- ---------- --------------- ---------

46   296 -2048814779     13-NOV-25

46   297 673525194       14-NOV-25

46   298 1873920005      15-NOV-25

46   299 -1861525061     16-NOV-25

46   300 -256859954      17-NOV-25

46   301 217165365       18-NOV-25

46   302 -1750936383     19-NOV-25

46   303 331015710       20-NOV-25

46   304 1350010975      21-NOV-25

46   305 -1931474758     22-NOV-25

46   306 -1112942378     23-NOV-25



insert into unpar_table values(11110016,11002,dbms_random.random,TO_DATE('10/05/2013', 'DD/MM/YYYY'));

insert into unpar_table values(11110017,11002,dbms_random.random,TO_DATE('11/05/2013', 'DD/MM/YYYY'));

commit;

insert into unpar_table values(11110018,11003,dbms_random.random,TO_DATE('12/05/2015', 'DD/MM/YYYY'));

commit;

insert into unpar_table values(110055519,11004,dbms_random.random,TO_DATE('13/05/2015', 'DD/MM/YYYY'));

commit;


SQL> CREATE TABLE exchtab1 as SELECT * FROM unpar_table WHERE date_used <(TO_DATE('10/05/2015', 'DD/MM/YYYY')) ;


Table created.


SQL> CREATE TABLE exchtab2 as SELECT * FROM unpar_table WHERE date_used BETWEEN (TO_DATE('10/05/2015', 'DD/MM/YYYY')) AND (TO_DATE('15/05/2015', 'DD/MM/YYYY'));


Table created.


SQL> CREATE TABLE exchtab3 as SELECT * FROM unpar_table WHERE date_used BETWEEN (TO_DATE('15/05/2015', 'DD/MM/YYYY')) AND (TO_DATE('15/05/2025', 'DD/MM/YYYY'));


Table created.


SQL> alter table tt exchange partition unpar_table_12 with table exchtab1;


Table altered.


SQL> alter table tt exchange partition unpar_table_15 with table exchtab2;


Table altered.


SQL> alter table tt exchange partition unpar_table_16 with table exchtab3;


Table altered.


查询数据情况:


SQL> SELECT count(*) FROM unpar_table WHERE date_used <(TO_DATE('15/05/2025', 'DD/MM/YYYY'));


  COUNT(*)

----------

    113007


SQL> select count(*) from tt;


  COUNT(*)

----------

    113007

















来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69924215/viewspace-3074274/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-19

  • 博文量
    81
  • 访问量
    90367