Oracle PL/SQL:SELECT 来自分区 TABLE 的两个相邻分区的不同 FIELD1、FIELD2

Oracle PL/SQL: SELECT DISTINCT FIELD1, FIELD2 FROM TWO ADIACENT PARTITIONS OF A PARTITIONED TABLE

我有一个分区 table,其中有一个字段 MY_DATE,它总是且只是从 1999 年到 2017 年每个月的第一天。

例如,它包含具有 01/01/2015、01/02/2015、..... 01/12/2015 的记录,例如 01/01/1999、01/02/1999 和等等。

字段MY_DATE为分区字段

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

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

"ORA-14099: all rows in table do not qualify for specified partition".

我正在使用语句:

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 是一个巨大的 table,大约有 5 亿条记录。

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

我的做法是:复制分区M的数据,复制分区M-1的数据,然后SELECT DISTINCT FIELD2, FIELD3 from DESTINATION_TABLE.

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

我要复制,...

请注意,EXCHANGE PARTITION 不执行复制,但 EXCHANGE。 IE。大table和临时table的分区内容调换了。 如果你对两个不同的分区和相同的温度执行两次 table 你会得到你收到的错误。

要复制(提取数据而不改变大table)你可以使用

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

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

您的来源 table 未更改,在您准备好后简单地删除两个临时文件 table。两个分区只需要额外 space。

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

with tmp as (
select * from bigtable partition (partition_name1)
union all
select * from bigtable partition (partition_name2)
)
select ....
from tmp;

祝你好运!