2016-01-06 2 views
-2

Я пытаюсь улучшить производительность в команде informatica presql, которая обновляет большую таблицу (записи 100mil) без предложения where (обновляет один столбец до нуля). Это занимает больше часа, и мне нужно получить лучшие результаты. Любая идея о том, как его улучшить, будет отличной. Заранее спасибо. В таблице 3 имеют индексы и первичные ключи данные Субаккаунт CaseIdКак улучшить обновление большой таблицы

не распределяли.

Сейчас его

Update table1 set column1 = null 
+1

Как мы можем оптимизировать ваш код, если мы его не видим? – GolezTrol

+0

Прямо сейчас его только нормальное обновление .. – sagi

+0

И структура таблицы? Индексы, ограничения внешнего ключа, триггеры и т. Д. Значительно повлияют на производительность такого обновления. Нам нужно знать, есть ли триггеры или любые индексы или ограничения для этого столбца. Если есть, возможно, было бы лучше временно отключить или удалить их во время обновления. – GolezTrol

ответ

3

Вы можете обеспечить параллельный DML & подсказки, чтобы улучшить производительность.

alter session enable parallel dml; 

UPDATE /*+ full(t) parallel (t 8) */ table1 t set column1 = null ; 

Вы можете просмотреть полную статью here.

+0

Я попробую это. Благодарю. – sagi

+0

Это ничего не меняет. – sagi

0

или вы можете попробовать это, если и действительно не нужен где:

alter table table1 drop column column1 ; 

alter table table1 add column column1 column1_datatype default NUll ; 

это будет быстро :)

+0

Я думал об этом, но я кабине меняю структуру и порядок стола – sagi

+0

Вы можете удалить, но вы не можете изменить? немного странно, но тогда u должен использовать параллельное обновление по крайней мере – Thomas

+0

Не могу * сделать оба .. Я попробую параллель – sagi

0

вы можете также рассмотреть возможность фиксации каждые 100000 строк.

declare 
    n_num number; 
begin 
    n_num := 0; 
    for x in (select rowid rid from table1) loop 
    Update table1 set column1 = null where rowid = x.rid; 
    n_num := n_num + 1; 
    if mod(n_num,100000) = 0 then 
     commit; 
    end if; 
    end loop; 
    commit; 
end;