Необходимо переместить ЗАВЕРШЕННЫЕ записи из одной таблицы в другую таблицу в БД Oracle - PullRequest
0 голосов
/ 24 октября 2019

У меня есть миллион записей в таблице, которые накапливаются каждую секунду, поэтому, когда запись помечается как статус ЗАВЕРШЕННЫЙ, я хочу переместить эти записи в резервную таблицу. Эту работу я буду периодически запускать. Также я не хочу прерывать другие операции в БД с помощью этой операции перемещения.

Я пробовал следующий запрос.


insert into Table_Bakup  
select * from Table where batch_status ='COMPLETED' 
and ID not in (select ID from Table_Bakup )

delete from Table 
where ID in  (select ID from Table_Bakup )

Но с вышеупомянутымпроизводительность запроса будет затронута. Кто-нибудь может подсказать, как мне этого добиться?

1 Ответ

0 голосов
/ 24 октября 2019

«Периодически», о котором вы упомянули, звучит как работа с базой данных, запуск которой запланирован ... Я не знаю, как часто. Один раз в день? Каждые 2 часа? Вы решаете.

Процедура может выглядеть следующим образом:

update table set cb_to_be_moved = 1 where status = 'COMPLETED';

insert into table_bakup (col1, col2, ...)
  select col1, col2, ...
  from table
  where cb_to_be_moved = 1;

delete from table where cb_to_be_moved = 1;

Почему cb_to_be_moved? Так как затронуты миллионы строк, между вашими операторами insert и delete могут быть некоторые другие строки, для которых установлено, что они "завершены" (и эти транзакции зафиксированы). Если вы используете идентификаторы, да - это работает, но - вы должны сравнить миллионы строк в table с миллиардами строк в table_bakup, поэтому этот (cb_to_be_moved) подход может быть быстрее.

Триггер базы данных? Да, но - представьте себе, что происходит, когда она запускается для миллионов строк ... база данных может удушить . А может и нет;попробуй проверить это.

...