Partition-方案二:通过 Insert with a subquery 方法

本文介绍了如何通过Insert with a subquery方法创建Oracle分区表。首先创建分区表,然后通过子查询将非分区表数据分组提交到新表中,注意避免回滚空间不足的问题。在过程中提到了并行模式的使用和数据一致性检查,最后讨论了如何利用direct path insert和并行提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方案二:通过 Insert with a subquery 方法
还是使用方案一中的普通大表WZ_REAL_DATA来进行实验。此种方式需要应用。步骤如下:
1) 创建一个分区表:

SQL>CREATE TABLE WZ_REAL_DATA_tmp
   (STIME DATE NOT NULL,
    PI_AI_POINT VARCHAR2(30) NOT NULL,
    FVALUE NUMBER(16,4),
     CONSTRAINT PK_WZ_REAL_DATA2 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;

2) 将原来非分区表中的数据通过子查询 insert 到新创建的分区表中:

SQL>alter session enable parallel dml;
SQL>insert /*+APPEND PARALLEL*/ into WZ_REAL_DATA_tmp select * from WZ_REAL_DATA;

注意直接插入全部数据容易报undo表空间不足

ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS2'

改成分组提交:

SQL> insert into WZ_REAL_DATA_tmp select * from WZ_REAL_DATA where stime<to_date('2013-01-01','yyyy-mm-dd');
insert into WZ_REAL_DATA_tmp select * from WZ_REAL_DATA where stime<to_date('2013-01-01','yyyy-mm-dd')
            *
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number 19 with name
"_SYSSMU19_4086232787$" too small

快照过旧了。。。。再分细一点:

SQL> conn xdwz/qizhengtao
Connected.
SQL> insert /*+APPEND PARALLEL*/ into WZ_REAL_DATA_tmp select * from WZ_REAL_DATA where stime<to_date('2012-06-01','yyyy-mm-dd');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值