首页 > 解决方案 > 交换和拆分分区有问题

问题描述

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

创建了一个新表 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;

它的投掷分区不能沿着指定的上限分割。

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

标签: oracle12cdatabase-partitioning

解决方案


当您在未经验证的情况下交换数据时(可能是为了提高性能),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

按照设计,将数据放在不正确的分区上是不好的。请在执行未经验证的交换之前验证或过滤正确的数据。


推荐阅读