Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
IgorMp Member Откуда: Сообщений: 29 |
Здравствуйте! Имеется относительно большая таблица для которой необходимо изменить значение в определённой колонке: UPDATE TABLE_A SET COLUMN_A = '1';Проблема в том, что такой Update выполняется долго и на время выполнения запроса блокируются все строки таблицы. Вопрос - можно ли выполнить такой же Update блокируя только единичную строку в каждый момент - через курсор или как-то еще - я не специалист, не уверен? Спасибо |
13 янв 21, 13:22 [22262602] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
dmdmdm Member Откуда: Нижний Новгород Сообщений: 1680 |
Ну и если вы меняете значимые для других сессий поля, нужно не забывать про многопользовательский режим - запланировать update на нужное время, выставить блокировки и т.д. |
13 янв 21, 13:46 [22262617] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52117 |
Обычно они не блокируются. Как Вы этого добились? Posted via ActualForum NNTP Server 1.5 |
||
13 янв 21, 13:46 [22262619] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2908 |
относительно большая таблица, ето сколько? ps менять в цикле напр по 100тысч строк ..... stax |
||||
13 янв 21, 13:49 [22262624] Ответить | Цитировать Сообщить модератору |
IgorMp Member Откуда: Сообщений: 29 |
Я сам сделал такой вывод т.к. по логам сервер не ответил как раз в то время, когда выполнялся данный запрос. И я всегда считал, что при вызове типа UPDATE TABLE_A SET COLUMN_A = '1' WHERE SOME_CONDITIONRow lock устанавливается на все строки подпадающие под "SOME_CONDITION" а если WHERE не указано - то на все строки таблицы. Разве это не так? |
||||||
13 янв 21, 14:00 [22262634] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52117 |
Это не MS SQL сервер, читатели не блокируются писателями. Posted via ActualForum NNTP Server 1.5 |
||
13 янв 21, 14:05 [22262640] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 6977 |
Читатели не блокируются, возможно у вас просто все ресурсы сервера на этот update ушли |
13 янв 21, 14:08 [22262641] Ответить | Цитировать Сообщить модератору |
IgorMp Member Откуда: Сообщений: 29 |
Я ни слова и не говорил о читателях. И меня все писатели. Сервер не ответил на модифицирующий запрос. |
||||
13 янв 21, 14:13 [22262643] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 6977 |
IgorMp, cursor + fetch bulk collect into limit + forall упд. А так и задумано что другие сессии будут менять те же строки в то же время? Сообщение было отредактировано: 13 янв 21, 14:22 |
13 янв 21, 14:25 [22262650] Ответить | Цитировать Сообщить модератору |
env Member Откуда: Россия, Москва Сообщений: 6977 |
Так тогда можно и не обновлять, всё равно никто не прочитает. |
||||
13 янв 21, 14:30 [22262653] Ответить | Цитировать Сообщить модератору |
IgorMp Member Откуда: Сообщений: 29 |
dmdmdm, Спасибо, вариант с курсором действительно не блокирует остальные строки - как раз то что нужно. |
||||
13 янв 21, 14:46 [22262670] Ответить | Цитировать Сообщить модератору |
IgorMp Member Откуда: Сообщений: 29 |
Мир не идеален :) Кто-то просто пишет скрипт, запускающийся ночью по расписанию, в который включён сплошной UPDATE таблицы и длящийся более 30 сек. А другой человек должен решить проблему отваливающихся по таймауту запросов во время выполнения этого скрипта. И человека, который решает конкретную проблему никто не спросил, можно ли апдейтить продакшен базу наживую. "Задумано" тут просто никак не ложится :) Сообщение было отредактировано: 13 янв 21, 14:56 |
||||
13 янв 21, 14:55 [22262686] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |