Параллельные запросы для вставки данных в многораздельную таблицу в Oracle - PullRequest
0 голосов
/ 26 октября 2018

Я выполняю параллельные запросы вставки (12 запросов одновременно) через инструмент ETL для вставки данных в многораздельную таблицу в Oracle.

Определение таблицы:

CREATE TABLE CUST_TRAN
(
TRAN_SEQ_NO NUMBER(20,0)
, TRAN_DATE DATE
) 
TABLESPACE USERS
STORAGE (INITIAL 256K NEXT 256K)
PARTITION BY RANGE (TRAN_DATE) 
INTERVAL(NUMTODSINTERVAL(1, 'DAY')) 
(  
   PARTITION CUST_TRAN_p_old VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY'))
)

12 запросов выполняются для 4 разных дат (3 запроса для каждой даты). Итак, 12 запросов пытаются вставить в 4 раздела. Вот пример запроса вставки -

insert into cust_tran 
select a.tran_seq_no, trunc(a.tran_datetime) as tran_date
from table_a a
    inner join table_b b on a.store = b.store
        and a.tran_seq_no = b.tran_seq_no
        and trunc(a.tran_datetime) = to_date('2018-01-31', 'YYYY-MM-DD')
        and a.tran_type in ('SALE')

Однако я продолжаю сталкиваться с одной из следующих проблем -

1) Я получаю эту ошибку - ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions

Или

2) Задание выполняется без ошибок, но вставляет данные в раздел CUST_TRAN_SUMM_p_old со странной датой, которой не было ни в одном из исходных запросов, и эта дата не существует в исходных таблицах. Трудно сказать точное значение этой странной даты, потому что, когда я использую SQL Developer и форматирую дату, которая будет отображаться как ГГГГ-ММ-ДД HH24: MI: SS (в меню Инструменты> Предпочтения> База данных> NLS), он отображает ноль, но когда я меняю формат отображения на DD-MON-RR HH24: MI: SS, он отображает 29-НОЯБРЬ-01 22:58:59. Когда я использую DBeaver, он отображается как 10101-11-29 22:58:59. Когда я использую Toad for Oracle, он отображается как 01.01.00.

Первая проблема действительно странная, потому что я поставляю дату в фильтре, и нет никакого способа, которым она может забрать другую дату, которой нет в фильтре. Плюс, я запускаю это после свежего создания таблицы. Таким образом, невозможно, чтобы оно достигло максимального количества разделов (1 023 999).

Второй вопрос одинаково странный.

Это ошибка в Oracle? Есть ли в Oracle какие-то настройки, которые нужно изменить? Разве неправильно вставлять данные, используя параллельные запросы вставки в многораздельную таблицу?

1 Ответ

0 голосов
/ 26 октября 2018

Одна вещь, по крайней мере, кажется ясной.Вы упомянули ошибку

 ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions

, которая возникает, когда вы вставляете значение NULL в ключ раздела таблицы интервальных разделов.

Просто попробуйте этот INSERT

 insert into CUST_TRAN (TRAN_SEQ_NO,TRAN_DATE) Values(1,null); 

Простого обходного пути для этой проблемы не существует, чаще всего для замены отсутствующей даты используется некоторая странная дата (например, 01.01.2999) - см., Например, здесь

Здесь я бы начал расследование - предполагая, что странная дата , которую вы наблюдаете, является такой заменой для пропуска недействительных дат.

Недостаточно исследовать исходные базы данных,Типичный процесс ETL немного сложнее, чем простая вставка.Вы должны проверить код сценария ETL, чтобы увидеть, есть ли такая манипуляция с датой.

К вашей наблюдаемой дате 10101-11-29 - допустимый диапазон для лет исключает 10101 как год.

База данных Oracle может хранить даты в юлианскую эпоху, начиная с 1 января 4712 г. до н.э. до 31 декабря 9999 г. н.э. (Common Era, или «AD»).Если BCE («BC» в маске формата) не используется специально, записи даты CE являются значениями по умолчанию.

Из того факта, что эта дата находится в разделе old (то есть меньше, чем 2008), Я бы предположил, что это ноябрь года 29 - DATE'0029-11-01' и ДЕНЬ каким-то образом соединяется с другой строкой на выходе .

...