Oracle-带有表的exchange分区

Oracle-带有表的exchange分区,oracle,database-administration,Oracle,Database Administration,我尝试在Oracle 11g.2.0.3上创建一个table2,其中包括: CREATE table2 LOGGING TABLESPACE TS_table1_2014 PCTFREE 10 INITRANS 1 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ) NOCOMPRESS as (select * from table1 where date_t

我尝试在Oracle 11g.2.0.3上创建一个table2,其中包括:

CREATE table2 
LOGGING TABLESPACE TS_table1_2014 PCTFREE 10 INITRANS 1 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ) NOCOMPRESS
as (select * from table1 where date_text <= '2015-12-31');
我有以下查询的测试差异:

Select a.COLUMN_NAME 
  , a.DATA_TYPE, b.DATA_TYPE 
  , a.data_length, b.data_length 
  , a.data_precision, b.data_precision 
  , a.data_scale, b.data_scale 
  , a.nullable, b.nullable 
from ALL_TAB_COLUMNS a 
full outer join ALL_TAB_COLUMNS b on a.column_name=b.column_name 
 and b.owner=user and b.table_name='&table2' 
 where  a.owner=user and a.table_name='&table1'   
 and ( 
    nvl(a.data_type,'#')!=nvl(b.data_type,'#') 
    or nvl(a.data_length,-1)!=nvl(b.data_length,-1) 
    or nvl(a.data_precision,-100)!=nvl(b.data_precision,-100) 
    or nvl(a.data_scale,-100)!=nvl(b.data_scale,-100) 
    or nvl(a.nullable,'#')!=nvl(b.nullable,'#') 
   ) 
;
导致的一些差异是列大小。这种语法“createasselect”并没有保持创建的新表的顺序和大小

如何创建table2作为从table1中选择并强制保持与主table1源相同大小的列


谢谢

我在您的DDL中找不到任何差异。我建议使用相同的DDL创建表2,然后执行以下操作:

insert into table2 select * from table1;

我在你的DDL中找不到任何差异。我建议使用相同的DDL创建表2,然后执行以下操作:

insert into table2 select * from table1;

您需要使用dbms_元数据包或查询数据字典视图的数量(如所有_选项卡_列等)来获取现有表的元数据,以便为交换表构造正确的sql(用于exchange分区操作)。除了非空检查外,CTAS不会传输默认值和约束。
最佳实践是与分区表同时创建/重新创建/修改此表

您需要使用dbms_元数据包或查询数据字典视图的数量,如所有_tab_列等,以获取有关现有表的元数据,以便为交换表构造正确的sql(用于exchange分区操作)。除了非空检查外,CTAS不会传输默认值和约束。
最佳实践是与分区表同时创建/重新创建/修改此表

表1和表3的DDL是什么?在另一个具有类似表的数据集上,所有列的大小和顺序都可以通过简单的语法“create as select”创建。我怀疑用户分配的权限不同。您应该这样做分区:小于(截止日期('01-01-2015','dd-mm-yyyy')的值也需要DDL或表1的结构。表1和表3的DDL是什么?在另一个具有类似表的数据集上,所有列的大小和顺序都可以通过简单语法“创建为选择”创建. 我怀疑用户分配的权限不同。您应该这样做分区:小于(截止日期('01-01-2015','dd-mm-yyyy')的值也需要DDL或表1的结构,我希望避免插入。我使用“创建表作为选择”来提高执行速度。您可以将插入与获取批量和FORALL一起使用。另外,我们讨论的是语法错误,而不是性能错误:)我更喜欢避免插入到。我使用“创建表作为选择”来提高执行速度。您可以将插入与获取批量和FORALL一起使用。此外,我们讨论的是语法错误,而不是性能错误:)