Определите таблицу FINAL
, как требуется, и добавьте один технический столбец load_date
od DATE
type.
Пример:
create table FINAL_TABLES
(load_date DATE,
col1 varchar2(10));
Определите таблицу STG
с помощью та же структура, но с использованием interval partitioning
create table STG_TABLES
(load_date DATE,
col1 varchar2(10))
PARTITION BY RANGE (load_date)
INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
(
PARTITION p_init VALUES LESS THAN (TO_DATE('15-03-2020', 'DD-MM-YYYY'))
);
Теперь выполните sqoop
загрузку данных в таблицу STG
. load_date
- это отметка времени нагрузки, равное значение во всех строках .
Пример, имитирующий с insert
insert into STG_TABLES (load_date, col1)
values (sysdate,'new load');
commit;
На следующем шаге поменяйте местами содержимое таблиц STG
и FINAL
с использованием exchange partition
alter table STG_TABLES
exchange partition FOR (to_date('2020-03-15 05:55:00','yyyy-mm-dd hh24:mi:ss'))
with table FINAL_TABLES
without validation;
Раздел таблицы STG
идентифицируется текущим значением load_date
Теперь загружен данные находятся в таблице FILNAL
, а таблица STG
содержит прежнее состояние, если таблица FINAL
.
Вы можете избавиться от нее, отбросив раздел, что должно быть сделано непосредственно перед тем, как следующая загрузка. Последний вариант может помочь при устранении неполадок.
alter table STG_TABLES
drop partition FOR (to_date('2020-03-15 05:55:00','yyyy-mm-dd hh24:mi:ss'));
Заключительные замечания
Производительность этих шагов сопоставима с вашим решением с таблицей переименования (только данные словарь деятельности). Для потребителя таблицы FINAL
эта опция намного лучше, поскольку таблица постоянно существует, поэтому запросы не аннулируются с помощью RENAME
.
Если вы отложите DROP PARTITION
до следующей загрузки, даже длительные запросы во время загрузки сохранятся и будут продолжены в сегментах таблицы STG
.
Если в таблице FINAL
есть индексы, определите такую же структуру индексов для STG
, как и для LOCAL
индексов.
Убедитесь, что таблица STG
после загрузки имеет все индексы, действительные
Добавьте INCLUDING INDEXES
к оператору раздела exchange.
Вышеописанная схема определяет full refre sh load , т.е. старое состояние полностью перезаписывается новое состояние. Вы можете использовать тот же механизм для дельта-нагрузки , т.е. новая загрузка добавлена в текущем состоянии.
Простое определение таблицы STG
без разбиения на разделы и таблица FINAL
как секционированная.
Приведенный выше пример будет работать для дельта-загрузки один раз в день - настройте схему INTERVAL для разных частот.