Oracle PL / SQL:从分区表的两个附加分区中选择DISTINCT FIELD1,FIELD2

时间:2015-11-16 16:09:08

标签: sql oracle database-partitioning

我有一个分区表,字段为MY_DATE,它始终是1999年至2017年每个月的第一天。

例如,它包含01/01 / 2015,01 / 02/2015,...... 01/12/2015的记录,例如01/01 / 1999,01 / 02/1999,等等

字段MY_DATE是分区字段。

我想以最有效的方式,将两个相邻分区(月M和月M-1)的field2和field3的不同值复制到另一个表中,以便找到不同的一对整个日期的(field2,field3)。

Exchange分区仅在目标表未分区时有效,但在复制第二个相邻分区的数据时,我收到错误,

  

“ORA-14099:表格中的所有行都不符合指定分区的条件”。

我正在使用声明:

ALTER TABLE MY_USER.MY_PARTITIONED_TABLE EXCHANGE PARTITION PART_P201502 WITH TABLE MY_USER.MY_TABLE

当然,MY_PARTITIONED_TABLE和MY_TABLE具有相同的字段,但第一个字段按上述方式进行分区。

请假设MY_PARTITIONED_TABLE是一张包含大约5亿条记录的大表。

目标是找到两个相邻分区的(field2,field3)值的不同对。

我的方法是:复制分区M的数据,复制分区M-1的数据,然后从DESTINATION_TABLE中选择SELECT DISTINCT FIELD2,FIELD3。

非常感谢您考虑我的要求。

1 个答案:

答案 0 :(得分:1)

我想复制,...

请注意,EXCHANGE PARTITION不执行复制,但 EXCHANGE 。即切换大表和临时表的分区内容。 如果对两个不同的分区和相同的临时表执行两次,则会得到您收到的错误。

要复制(提取数据而不更改大表),您可以使用

create table tab1 as 
select * from bigtable partition (partition_name1)

create table tab2 as 
select * from bigtable partition (partition_name2)

您的源表未更改,准备好后简单地删除两个临时表。这两个分区只需要额外的空间。

也许您可以在不复制数据的情况下执行查询事件

with tmp as (
select * from bigtable partition (partition_name1)
union all
select * from bigtable partition (partition_name2)
)
select ....
from tmp;
祝你好运!