Параллельные запросы для вставки данных в многораздельную таблицу в 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

Или

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

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

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

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

Насколько я могу судить, не должно быть проблем (вашего типа), если имеется несколько источники операции вставки. Вы проверили источник? Во всяком случае, что это? Вы можете найти там дату "10101-11-29"?

Littlefoot 26.10.2018 07:14

Это определенно звучит странно и не должно происходить. Хорошая новость в том, что этого почти наверняка не происходит. Но вам нужно будет опубликовать воспроизводимый тестовый пример, если вы хотите, чтобы мы объяснили, что на самом деле происходит.

APC 26.10.2018 09:00

Что такое 10101? - это не может быть год, месяц или день .... Разместите дату в формате DD-MM-YYYY

Marmite Bomber 26.10.2018 20:17

@MarmiteBomber - когда я использую SQL Developer и форматирую дату, которая будет отображаться как YYYY-MM-DD HH24: MI: SS, отображается null. Когда я использую DBeaver, он отображается как 10101-11-29 22:58:59.

GiveSeek 26.10.2018 20:59
0
4
1 132
1

Ответы 1

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

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

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

Просто попробуйте это ВСТАВИТЬ

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

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

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

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

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

Oracle Database can store dates in the Julian era, ranging from January 1, 4712 BCE through December 31, 9999 CE (Common Era, or 'AD'). Unless BCE ('BC' in the format mask) is specifically used, CE date entries are the default.

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

Одно могу сказать точно - нет ничего плохого ни в инструменте ETL, ни в самом процессе. Я создал очень простой процесс ETL без каких-либо переменных. Я жестко запрограммировал все значения и даты. 12 вставьте запросы, выполняющиеся одновременно с помощью инструмента ETL.

GiveSeek 26.10.2018 21:01

Другие вопросы по теме