【问题标题】:Exchange & split partition have a issue交换和拆分分区有问题
【发布时间】:2019-10-15 15:44:13
【问题描述】:

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

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


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2023-02-09
      • 2015-01-06
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多