2013-04-18 3 views
1

Мне нужно сделать массовое обновление таблицы (~ 30 000 записей) в базе данных Oracle 10g. Проблема в том, что нет предложения «где», которое может выбирать целевые строки. Однако каждую целевую строку можно идентифицировать с помощью сложного ключа. Улов здесь заключается в том, что список составных ключей находится из внешнего источника (а не в базе данных).Лучший подход для массового обновления базы данных Oracle

В настоящее время у меня есть программа Java, которая перебирает список составных ключей и выплевывает процедуру PL/SQL, который по сути просто куча повторных update заявлений подобного следующему:

update table1 t set myfield='Updated' where t.comp_key1='12345' and t.comp_key2='98765'; 

Есть лучший способ сделать это, или это «достаточно хорошо», учитывая, что мы имеем дело только с ~ 30 тыс. записей?

+3

Вы можете сделать связку за раз, используя что-то вроде '... где (t.comp_key1, t.comp_key2) в (('12345', '98765'), ('11111', '11111'), ('22222', '22222')) '. Количество строк, которые вы можете обновить, будет зависеть от максимальной длины для оператора (который будет определен вашим драйвером данных Java), но вы должны иметь возможность получать 100 или более строк для каждого оператора. Это некрасиво, но вы бы сэкономили много поездок в оба конца. –

+1

Альтернативно вы можете проанализировать весь лот в базе данных и использовать функцию [table] (http://blog.lishman.com/2008/05/oracle-table-functions.html). – Ben

ответ

2

Хорошо.

30 000 обновлений с использованием первичного ключа, даже если они все жестко проанализированы, обычно занимают всего несколько секунд. Вероятно, вы могли бы ускорить процесс, объединив обновления, как предложил @Ed Gibbs. Но пока это выглядит очень быстрым процессом, который не стоит оптимизировать. Включение всего этого в одну процедуру PL/SQL было разумным шагом и сэкономило 99% времени, которое было бы необходимо для действительно наивного, по-рядовому-клиентскому решению.

3

Возможно, достаточно хорошо, но если внешний источник ключей является файлом, создайте внешнюю таблицу, указывающую на файл, чтобы выставить данные в файле как реляционную таблицу, а затем вы можете сделать это в слиянии (обновление).

Смежные вопросы