Апдейт таблицы выполняется более суток

Быдло__кодер
Дата: 02.12.2009 15:32:55
Есть таблица на 6,5 млн. записей. Триггеров, мат вью, индексов (кроме по PK) на таблицу нет
Выполняю обновление всех записей типа
 update big_table
 set column_id =  dbms_random.string('x',12)
Запрос выполняется уже 5 часов, и судя по всему будет выполняться еще долго:
select t.start_time,
       to_char(sysdate + t.TIME_REMAINING / 24 / 60 / 60, 'DD.MM.YYYY HH:MI:SS') end_time
from   v$session_longops t
where  sid = 149

start_time            end_time
-------------------------------------
02.12.2009 09:19:26   03.12.2009 12:00:32
И undo сегмент ужой полгига :(
Нет ли способов более быстрого апдейта всех записей?
dragonx
Дата: 02.12.2009 15:35:59
for i in (....)
loop
  udate...
  commit; каждые 10 000 строк например = )
end loop;
Maxifly
Дата: 02.12.2009 15:36:21
Заменить update
на
insert+delete

Люблю галеры - работящий коллектив, романтика мужского труда. Стоишь на мостике в пене брызг и эдак поворотясь:
- Голубчик! Утроить количество ударов - Али-паша уходит...
DВА
Дата: 02.12.2009 15:37:20
dbms_random.string('x',12)
а нафига?
Быдло__кодер
Дата: 02.12.2009 15:37:53
Дык курсором по идее я вообще на пенсию раньше уйду чем запрос выполниться. Кроме того, теряется атомарность операции (т.е милион проапдейтил, выключился свет и все, уже ничего не вернешь)
dragonx
Дата: 02.12.2009 15:41:29
Быдло__кодер
Дык курсором по идее я вообще на пенсию раньше уйду чем запрос выполниться. Кроме того, теряется атомарность операции (т.е милион проапдейтил, выключился свет и все, уже ничего не вернешь)


это смотря, куда commit воткнуть = )
Быдло__кодер
Дата: 02.12.2009 15:47:59
автор

Заменить update
на
insert+delete

хм.. не понял, как это?

DBA
dbms_random.string('x',12)
а нафига?

Долго объяснять.. вобщем так сложилось, что нужно заполнить колонку случайными 12 символьными строками
andrey_anonymous
Дата: 02.12.2009 15:53:10
Быдло__кодер
Дык курсором по идее я вообще на пенсию раньше уйду чем запрос выполниться. Кроме того, теряется атомарность операции (т.е милион проапдейтил, выключился свет и все, уже ничего не вернешь)


1) Курсор все-таки попробуйте. Просто для расширения кругозора. Уверяю, до пенсии точно успеете.
2) Атомарность заполнения таблицы _случайными строками, свет мигнул? Вы, должно быть, над нами шутите.
3) Не надо delete+insert. Но можно insert select + exchange partition + drop
4) Еще можно insert + update по соединению.
andrey_anonymous
Дата: 02.12.2009 15:54:29
Да, главное забыл - перед операцией устраните конкуренцию, как вариант - lock table
Maxifly
Дата: 02.12.2009 15:55:35
insert+delete

Ну можно например так

create table t_table as 
select rowid as rwd, 
         dbms_random.string('x',12) as column_id 
  from big_table;

update big_table b set b.column_id = (select column_id from t_table ttt where ttt.rwd = b.rowid);

или так
create table t_table as 
select <Здесь перечисляем все поля big_table кроме column_id >, 
         dbms_random.string('x',12) as column_id 
  from big_table;

delete from big_table;

insert into big_table(<Здесь перечисляем все поля big_table кроме column_id >, 
         column_id )
select Здесь перечисляем все поля big_table кроме column_id >, 
         column_id from t_table;

Второй вариант конечно подходит если на записи никто не ссылается