Параллельные запросы для вставки данных в секционированную таблицу в Oracle

Я выполняю параллельные запросы на вставку (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

Or

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

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

Вторая проблема не менее странная.

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


person GiveSeek    schedule 26.10.2018    source источник
comment
Насколько я могу судить, не должно быть проблем (в вашем роде), если есть несколько источников операции вставки. Вы проверяли источник? Что это такое? Вы можете найти там дату 10101-11-29?   -  person Littlefoot    schedule 26.10.2018
comment
Это определенно звучит странно и не должно происходить. Хорошая новость в том, что этого почти наверняка не происходит. Но вам нужно будет опубликовать воспроизводимый тестовый пример, если вы хотите, чтобы мы объяснили, что на самом деле происходит.   -  person APC    schedule 26.10.2018
comment
Что такое 10101? - это не может быть ни год, ни месяц, ни день.... Укажите дату в формате DD-MM-YYYY   -  person Marmite Bomber    schedule 26.10.2018
comment
@MarmiteBomber - Когда я использую SQL Developer и форматирую дату для отображения в виде ГГГГ-ММ-ДД ЧЧ24:МИ:СС, отображается ноль. Когда я использую DBeaver, он отображается как 10101-11-29 22:58:59.   -  person GiveSeek    schedule 26.10.2018


Ответы (1)


По крайней мере, одно вроде бы ясно. Ошибка, которую вы упомянули,

 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 г. н.э. (наша эра или «н.э.»). Если специально не используется BCE («BC» в маске формата), записи даты CE используются по умолчанию.

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

person Marmite Bomber    schedule 26.10.2018
comment
Я могу сказать вам одно точно — ни с инструментом ETL, ни с процессом все в порядке. Я создал очень простой процесс ETL без каких-либо переменных. Я жестко закодировал все значения и даты. 12 запросов на вставку, выполняемых одновременно с помощью инструмента ETL. - person GiveSeek; 26.10.2018