Exchange и разделенный раздел имеют проблему - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь обмениваться данными без разделов с данными разделов. Я сделал следующие шаги.

Создал новую таблицу TEMP_TABLE с разделом с диапазоном TEMP_TABLE_1 в качестве даты ('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;

Его бросающий раздел не может быть разбит вдоль указанной верхней границы.

Как получить данные, которые превышают указанную мною дату диапазона.

1 Ответ

0 голосов
/ 16 октября 2019

Поскольку вы обмениваетесь данными без проверки (возможно, для повышения производительности), 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 создает запись. Для меня в Oracle 12cR1 в Exadata последующие выполнения этого SQL с TRUNC сканировали точный раздел, в котором находилась запись, и не сканировали все разделы. Я проверил это с помощью столбцов PARTITON_START и PARTITION_STOP моего плана объяснения.

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

По своей структуре плохо размещать данные на неправильных разделах. Пожалуйста, подтвердите или отфильтруйте правильные данные перед выполнением обмена без проверки.

...