помогите с pl\sql`ем #2

voronetskaya

задача - записать в поле порядковый номер записи(если выбирать записи по возрасстанию поля clientid) только в том случае, если это поле not null.
родил я вот такой апдейт -
UPDATE Clients c SET c.CLIENTATTR3 = (select r from (select rownum as r, clientid from clients order by clientid ) a where a.clientid=c.clientid) where c.CLIENTATTR3 is not null;
и чем-то он мне не нравится...
кто подскажет как оптимизировать?

ava3443

Нормальный запрос. Упрощать тут нечего ИМХО.

xz_post

Может с CASE- сами попробовать
я к сожалению Оракл не знаю

voronetskaya

а чегож он работает блин так долго, если нормальный?

наверное надо таблицу временную делать...

zya369

попробуй select clientid as r, clientid from c order by clientid вставить в отдельную таблицу...
мб он этот селект на каждый апдейт делает?

zya369

ЗЫ а тебе это один раз надо сделать или много и часто?

voronetskaya

один раз

zya369

у нас был похожий случай - там был запрос типа
select a from b where id in (select * from some_function(some_params; [postgres]
на таблице a с 15000 элементов работал пипец как медленно, хотя функция возвращала от силы пару сотен id.
Но после переделки на
insert into temp_table select * from some_function(...);
select a from b where a.id = temp_table.id все сьало нормально
ЗЫ а а если с отдельной таблицей не получится, то можно создать таблицу, по структуре такую же как исходная и вставить туда все строки из исходной таблицы с замененными значениями clientattr3 (это проще, так как это делается селектом, а не апдейтом). а потом заменить строки в исходной таблице на строки из временной

voronetskaya

спасибо
я в общем-то примерно это и имел в виду в предыдущем посте
правда реализация пока отложилсь...
Оставить комментарий
Имя или ник:
Комментарий: