Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Update всех строк большой таблицы без блокировки всей таблицы  [new]
IgorMp
Member

Откуда:
Сообщений: 29
Здравствуйте!
Имеется относительно большая таблица для которой необходимо изменить значение в определённой колонке:
UPDATE TABLE_A SET COLUMN_A = '1';
Проблема в том, что такой Update выполняется долго и на время выполнения запроса блокируются все строки таблицы.

Вопрос - можно ли выполнить такой же Update блокируя только единичную строку в каждый момент - через курсор или как-то еще - я не специалист, не уверен?

Спасибо
13 янв 21, 13:22    [22262602]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1680
Да, можно.

update ... where [условие1];
commit;
update ... where [условие2];
commit;
...


В цикле - то же самое.

for c in (select smth from table) loop
  update table set ... where [некое условие, колонка и т.п.] = > != ... c.smth;
  commit;
end loop;
13 янв 21, 13:44    [22262614]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1680
Ну и если вы меняете значимые для других сессий поля, нужно не забывать про многопользовательский режим - запланировать update на нужное время, выставить блокировки и т.д.
13 янв 21, 13:46    [22262617]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52117

IgorMp
на время выполнения запроса блокируются *все* строки таблицы.

Обычно они не блокируются. Как Вы этого добились?

Posted via ActualForum NNTP Server 1.5

13 янв 21, 13:46    [22262619]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2908
IgorMp
Здравствуйте!
Имеется относительно большая таблица для которой необходимо изменить значение в определённой колонке:
UPDATE TABLE_A SET COLUMN_A = '1';
Проблема в том, что такой Update выполняется долго и на время выполнения запроса блокируются все строки таблицы.

Вопрос - можно ли выполнить такой же Update блокируя только единичную строку в каждый момент - через курсор или как-то еще - я не специалист, не уверен?

Спасибо


относительно большая таблица, ето сколько?


ps
менять в цикле напр по 100тысч строк

.....
stax
13 янв 21, 13:49    [22262624]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
IgorMp
Member

Откуда:
Сообщений: 29
Dimitry Sibiryakov

IgorMp
на время выполнения запроса блокируются *все* строки таблицы.

Обычно они не блокируются. Как Вы этого добились?

Я сам сделал такой вывод т.к. по логам сервер не ответил как раз в то время, когда выполнялся данный запрос.
И я всегда считал, что при вызове типа
UPDATE TABLE_A SET COLUMN_A = '1' WHERE SOME_CONDITION 
Row lock устанавливается на все строки подпадающие под "SOME_CONDITION"
а если WHERE не указано - то на все строки таблицы.
Разве это не так?
13 янв 21, 14:00    [22262634]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52117

IgorMp
Разве это не так?

Это не MS SQL сервер, читатели не блокируются писателями.

Posted via ActualForum NNTP Server 1.5

13 янв 21, 14:05    [22262640]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6977
Читатели не блокируются, возможно у вас просто все ресурсы сервера на этот update ушли
13 янв 21, 14:08    [22262641]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
IgorMp
Member

Откуда:
Сообщений: 29
env
Читатели не блокируются, возможно у вас просто все ресурсы сервера на этот update ушли

Я ни слова и не говорил о читателях. И меня все писатели.
Сервер не ответил на модифицирующий запрос.
13 янв 21, 14:13    [22262643]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6977
IgorMp,

cursor + fetch bulk collect into limit + forall

упд.

А так и задумано что другие сессии будут менять те же строки в то же время?

Сообщение было отредактировано: 13 янв 21, 14:22
13 янв 21, 14:25    [22262650]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6977
IgorMp
Я ни слова и не говорил о читателях. И меня все писатели

Так тогда можно и не обновлять, всё равно никто не прочитает.
13 янв 21, 14:30    [22262653]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
IgorMp
Member

Откуда:
Сообщений: 29
dmdmdm
Да, можно.

update ... where [условие1];
commit;
update ... where [условие2];
commit;
...


В цикле - то же самое.

for c in (select smth from table) loop
  update table set ... where [некое условие, колонка и т.п.] = > != ... c.smth;
  commit;
end loop;


dmdmdm, Спасибо, вариант с курсором действительно не блокирует остальные строки - как раз то что нужно.
13 янв 21, 14:46    [22262670]     Ответить | Цитировать Сообщить модератору
 Re: Update всех строк большой таблицы без блокировки всей таблицы  [new]
IgorMp
Member

Откуда:
Сообщений: 29
env

А так и задумано что другие сессии будут менять те же строки в то же время?

Мир не идеален :)
Кто-то просто пишет скрипт, запускающийся ночью по расписанию, в который включён сплошной UPDATE таблицы и длящийся более 30 сек.
А другой человек должен решить проблему отваливающихся по таймауту запросов во время выполнения этого скрипта.
И человека, который решает конкретную проблему никто не спросил, можно ли апдейтить продакшен базу наживую.
"Задумано" тут просто никак не ложится :)

Сообщение было отредактировано: 13 янв 21, 14:56
13 янв 21, 14:55    [22262686]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить