Oracle - Как обрабатываются строки в многораздельной таблице, если соответствующий интервал уже удален? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть существующая таблица, которая разбита на разделы на основе схемы разделения по диапазонам:

create table History(
hid number(19,0),
type varchar2(255 char),
lastupdated timestamp (6) not null enable,
name varchar2(255 char),
primary key (hid))
partition by range (lastupdated) interval (numtodsinterval(1,'day'))
(partition retailhistory values less than (to_timestamp('12/01/2020','DD/MM/YYYY')));

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

Скажем, в приведенном выше случае раздел для истории розничной торговли теперь отброшена, а затем я хочу вставить данные с отметкой времени (11.01.2020), поскольку датой начала для раздела было 12 января.

Как эти данные теперь будут размещаться в разделе. Я вижу, что строка теперь вставлена ​​в таблицу, но я не вижу созданный системой раздел, созданный для этой даты. Любая помощь будет оценена. Спасибо. :)

Изменить: я удалил раздел, используя следующую технику:

Изменить интервал установки истории таблицы (numtodsinterval (1, 'day'));

Затем

Изменить индексы обновления истории розничных продаж разделов истории таблицы;

Раздел retailhistory хранит данные до 12 января. После удаления этого раздела следующий сгенерированный системой раздел становится нижней границей.

Теперь я хочу вставить данные с отметкой времени, скажем, 1 января. Итак, как с этим поступить.

1 Ответ

2 голосов
/ 17 июня 2020

Вы можете увидеть, какому разделу каждая строка данных назначена, с помощью запроса типа:

select h.lastupdated, uo.subobject_name
from history h
join user_objects uo on uo.data_object_id = dbms_rowid.rowid_object(h.rowid);

Вставляемая вами строка будет go в любой из разделов с наименьшим high_value, превышающим дата, которую вы вводите, 2020-01-11. Если вы сохранили разделы, скажем, на февральские даты и удалили все из них в январе, то при вставке 2020-01-11 будет go в том же разделе, что и временные метки на 2020-02-01. high_value для этого будет 2020-02-02 00:00:00; ваши данные перед этим, поэтому в нем будет go.

db <> fiddle demo


После удаления этого раздела следующий сгенерированный системой раздел становится нижней границей.

Нет, это не нижняя граница.

Из документации :

У каждого раздела есть предложение VALUES LESS THAN, которое указывает не включающую верхнюю границу для разделов. Любые значения ключа разделения, равные или превышающие этот литерал, добавляются в следующий более высокий раздел. Все разделы, кроме первого, имеют неявную нижнюю границу, заданную предложением VALUES LESS THAN предыдущего раздела.

Следующий сгенерированный системой раздел становится нижним верхняя граница

После того, как вы удалили старые разделы, новый «первый» раздел все еще не имеет нижней границы, поэтому любые предыдущие значения будут go в этом сегменте.

В ваша исходная таблица только с разделом retailhistory, если бы вы вставили значение до этого, например timestamp 1999-12-31, то оно все равно попало бы в этот раздел, потому что это значение меньше, чем 2020-01-12.

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

...