У меня есть процесс, который конвертирует даты из GMT в восточное стандартное время Австралии.Для этого мне нужно выбрать записи из базы данных, обработать их и затем сохранить их обратно.
Чтобы выбрать записи, у меня есть следующий запрос:
SELECT id,
user_id,
event_date,
event,
resource_id,
resource_name
FROM
(SELECT rowid id,
rownum r,
user_id,
event_date,
event,
resource_id,
resource_name
FROM user_activity
ORDER BY rowid)
WHERE r BETWEEN 0 AND 50000
, чтобы выбратьблок из 50000 рядов из ок.60 миллионов строкЯ разделяю их, потому что a) Java (для чего написан процесс обновления) не хватает памяти с слишком большим количеством строк (у меня есть объект bean для каждой строки) и b) у меня есть только 4 гигабайта временного пространства Oracle для воспроизведенияс.
В процессе я использую rowid для обновления записи (поэтому у меня есть уникальное значение) и rownum для выбора блоков.Затем я вызываю этот запрос итерациями, выбирая следующие 50000 записей, пока не останется ни одной (java-программа контролирует это).
Проблема, которую я получаю, заключается в том, что у меня все еще не хватает временного пространства Oracle с этимзапрос.Мой администратор БД сказал мне, что больше временного пространства не может быть предоставлено, поэтому необходимо найти другой метод.
Я попытался заменить подзапрос (который, как я предполагаю, использует все временное пространство с сортировкой) с представлениемно план объяснения с использованием представления идентичен одному из исходных запросов.
Есть ли другой / лучший способ добиться этого, не сталкиваясь с проблемами памяти / пространства?Я предполагаю, что запрос на обновление для обновления дат (в отличие от java-программы) будет страдать от той же проблемы с использованием доступного временного пространства?
Ваша помощь в этом очень важна.
Обновление
Я пошел по пути блока pl / sql, как показано ниже:
declare
cursor c is select event_date from user_activity for update;
begin
for t_row in c loop
update user_activity
set event_date = t_row.event_date + 10/24 where current of c;
commit;
end loop;
end;
Однако у меня заканчивается свободное место.У меня сложилось впечатление, что если коммит был сделан после каждого обновления, то необходимость в отмене места минимальна.Я не прав в этом предположении?