Exchange和拆分分区有问题

Exchange & split partition have a issue

提问人:Siva Ram 提问时间:10/15/2019 最后编辑:Siva Ram 更新时间:10/16/2019 访问量:227

问:

我正在尝试将非分区数据与分区数据交换。我已经完成了以下步骤。

创建了一个新表TEMP_TABLE,分区的TEMP_TABLE_1范围为 date('1-09-2019')。 我用过

     ALTER TABLE TEMP_TABLE
     EXCHANGE PARTITION TEMP_TABLE_1
     WITH TABLE ORG_TABLE
     WITHOUT VALIDATION
     UPDATE GLOBAL INDEXES;

有了这个,我的表数据与分区交换,新表我可以看到带有数据的分区。 但现在的问题是,当我尝试时,数据包含的行日期超过 1-09-2019

     select count(*) from TEMP_TABLE where date > '1-09-2019';

它给出 0,尽管有数据显示到今天的日期。

如果我尝试拆分这个分区

     ALTER TABLE TEMP_TABLE SPLIT PARTITION TEMP_TABLE_1  INTO (PARTITION 
     TEMP_TABLE_2 values LESS THAN (TO_DATE('01-OCT-2019 00:00:00', 'DD-MON- 
     YYYY HH24:MI:SS')),       PARTITION TEMP_TABLE_1)  UPDATE GLOBAL INDEXES 
     PARALLEL 4;

它的抛出分区不能沿指定的高边界进行拆分。

如何获取超过我提供的范围日期的数据。

oracle12c 数据库分区

评论


答:

0赞 ArtBajji 10/16/2019 #1

由于在未验证的情况下交换数据(可能是为了提高性能),因此 Oracle 不会验证插入的数据的分区键列的值是否与插入该数据的分区的分区范围条件匹配。

--partitioned table
create table mytabp(n date)
partition by range(n)
interval(numtodsinterval(1, 'DAY'))
(partition p0 values less than (to_date('20190901','yyyymmdd')));

--nonpartitioned table to hold the data outside partition range
create table temp_mytab(n date);

insert into temp_mytab values(to_date('20191001','yyyymmdd'));

--exchanging without validation
alter table mytabp exchange partition p0 with table temp_mytab without validation;

--Data exists
select count(1) from mytabp;--1

由于以下查询中的分区修剪,该记录将在分区中搜索,根据定义,该分区必须保存此数据。由于记录存在于不正确的分区中,因此不会返回该数据。

select count(1) from mytabp where n > to_date('20190901','yyyymmdd');--0

通过在分区列上应用 TRUNC,Oracle 将提供扫描所有分区的选项。因此,下面的 SQL 生成记录。对于我在 Exadata 上的 Oracle 12cR1 上来说,使用 TRUNC 执行此 SQL 的后续操作会扫描记录所在的确切分区,而不是扫描所有分区。我用我的解释计划的 PARTITON_START 和 PARTITION_STOP 列检查了这一点。

select count(1) from mytabp where trunc(n) > to_date('20190901','yyyymmdd');--1

根据设计,将数据放在不正确的分区上是不好的。在执行交换之前,请验证或过滤正确的数据,而无需验证。