Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Update всех строк большой таблицы без блокировки всей таблицы / 13 сообщений из 13, страница 1 из 1
13.01.2021, 13:22
    #40035384
IgorMp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
Здравствуйте!
Имеется относительно большая таблица для которой необходимо изменить значение в определённой колонке:
Код: plaintext
UPDATE TABLE_A SET COLUMN_A = '1';
Проблема в том, что такой Update выполняется долго и на время выполнения запроса блокируются все строки таблицы.

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

Спасибо
...
Рейтинг: 0 / 0
13.01.2021, 13:44
    #40035395
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
Да, можно.

Код: plsql
1.
2.
3.
4.
5.
update ... where [условие1];
commit;
update ... where [условие2];
commit;
...



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

Код: plsql
1.
2.
3.
4.
for c in (select smth from table) loop
  update table set ... where [некое условие, колонка и т.п.] = > != ... c.smth;
  commit;
end loop;
...
Рейтинг: 0 / 0
13.01.2021, 13:46
    #40035398
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
Ну и если вы меняете значимые для других сессий поля, нужно не забывать про многопользовательский режим - запланировать update на нужное время, выставить блокировки и т.д.
...
Рейтинг: 0 / 0
13.01.2021, 13:46
    #40035399
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
IgorMpна время выполнения запроса блокируются *все* строки таблицы.

Обычно они не блокируются. Как Вы этого добились?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.01.2021, 13:49
    #40035404
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
IgorMp
Здравствуйте!
Имеется относительно большая таблица для которой необходимо изменить значение в определённой колонке:
Код: plaintext
UPDATE TABLE_A SET COLUMN_A = '1';
Проблема в том, что такой Update выполняется долго и на время выполнения запроса блокируются все строки таблицы.

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

Спасибо


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


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

.....
stax
...
Рейтинг: 0 / 0
13.01.2021, 14:00
    #40035412
IgorMp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
Dimitry Sibiryakov

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

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

Я сам сделал такой вывод т.к. по логам сервер не ответил как раз в то время, когда выполнялся данный запрос.
И я всегда считал, что при вызове типа
Код: plaintext
UPDATE TABLE_A SET COLUMN_A = '1' WHERE SOME_CONDITION 
Row lock устанавливается на все строки подпадающие под "SOME_CONDITION"
а если WHERE не указано - то на все строки таблицы.
Разве это не так?
...
Рейтинг: 0 / 0
13.01.2021, 14:05
    #40035416
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
IgorMpРазве это не так?

Это не MS SQL сервер, читатели не блокируются писателями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.01.2021, 14:08
    #40035417
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
Читатели не блокируются, возможно у вас просто все ресурсы сервера на этот update ушли
...
Рейтинг: 0 / 0
13.01.2021, 14:13
    #40035419
IgorMp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
env
Читатели не блокируются, возможно у вас просто все ресурсы сервера на этот update ушли

Я ни слова и не говорил о читателях. И меня все писатели.
Сервер не ответил на модифицирующий запрос.
...
Рейтинг: 0 / 0
13.01.2021, 14:25
    #40035425
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
IgorMp,

cursor + fetch bulk collect into limit + forall

упд.

А так и задумано что другие сессии будут менять те же строки в то же время?
...
Рейтинг: 0 / 0
13.01.2021, 14:30
    #40035427
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
IgorMp
Я ни слова и не говорил о читателях. И меня все писатели

Так тогда можно и не обновлять, всё равно никто не прочитает.
...
Рейтинг: 0 / 0
13.01.2021, 14:46
    #40035435
IgorMp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
dmdmdm
Да, можно.

Код: plsql
1.
2.
3.
4.
5.
update ... where [условие1];
commit;
update ... where [условие2];
commit;
...



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

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



dmdmdm, Спасибо, вариант с курсором действительно не блокирует остальные строки - как раз то что нужно.
...
Рейтинг: 0 / 0
13.01.2021, 14:55
    #40035447
IgorMp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update всех строк большой таблицы без блокировки всей таблицы
env

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

Мир не идеален :)
Кто-то просто пишет скрипт, запускающийся ночью по расписанию, в который включён сплошной UPDATE таблицы и длящийся более 30 сек.
А другой человек должен решить проблему отваливающихся по таймауту запросов во время выполнения этого скрипта.
И человека, который решает конкретную проблему никто не спросил, можно ли апдейтить продакшен базу наживую.
"Задумано" тут просто никак не ложится :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Update всех строк большой таблицы без блокировки всей таблицы / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]