2016-11-16 2 views
3

У меня есть таблица, что мне нужно обновить:Как оптимизировать производительность добавления в CLOB в UPDATE?

create table test_tab(id number, first varchar2(100), second clob); 
insert into test_tab values (1, 'john', 'kowalski'); 
insert into test_tab values (2, 'michael', 'surname'); 

Теперь для каждой записи в моей таблице, я хочу, чтобы добавить строку в поле CLOB. Я мог бы использовать обычный оператор конкатенации:

update test_tab set second = second || 'some_string,'; 

И это работает, но потому, что моя текущая таблица как 80k строк, процесс обновления длится слишком долго.

Я думаю об использовании DBMS_LOB.APPEND(), но я не знаю, как использовать его в UPDATE, и если он поможет повысить производительность.

Любые идеи? Заранее спасибо.

+1

Данные в 'second' столбце должен быть обновлен, для каждой записи, и эта работа не может быть предотвращено. Как долго длится? –

+0

@TimBiegeleisen - обновление только для одного столбца длится около 30 секунд. Иногда мне нужно вызвать процедуру для нескольких столбцов, поэтому это время умножается. – Jangcy

+0

Я поддержал вас, но я никогда не слышал о массовом обновлении, конечно, не о том, что ускорит ситуацию. –

ответ

1

Когда вам нужно обновить КАЖДУЮ запись в таблице, всегда лучше воссоздавать таблицу как select (CTAS). Независимо от того, какой метод вы обновляете столбец LOB.

Пример:

create table temp 
as 
select id, first, second||' some_string' as second 
    from test_tab; 

rename test_tab to old_test_tab; -- you can drop it later 
rename temp to test_tab; 

-- then you need to move all indexes, grants and etc from old_test_tab to test_tab; 
+0

Эй @ Rusty. Спасибо за ваш ответ. Не могли бы вы уточнить, что вы подразумеваете под «воссозданием таблицы»? Или, может быть, небольшой пример? – Jangcy

+0

Я обновил свой ответ простым примером. – Rusty

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