Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Тяжелый апдейт в рабочее время  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Наставьте, так, по-отцовски.

Иногда в рабочее время подмывает привести в порядок данные.

Однако сами данные довольно активно используются, база транзакционная.
Но руки то чешутся!

update ParamPamPams p set kind = 457 where kind in (458, 807, 685, 686, 486, 487)

при этом записей в таблице всего 3,5 млн записей, с распределением по искомым параметрам:

kind
----------- -----------
457 229 410
458 204 304
487 35 898
486 35 732
686 10 409
685 979

Ну т.е. нужно проапдейтить 300 000 строк в нагруженной таблице из 3 500 000

Обычно после минут пяти-десяти ожидания такого апдейта все нафиг зависает, и приходиться килять процессы, с вытекающими.

А если очень хочется? (Или если капризы не принципиально не обсуждаем то "очень нужно")

Есть ли какой-то лайф-хак для таких случаев? :)
27 ноя 09, 15:58    [7988825]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
iljy
Member

Откуда:
Сообщений: 8711
Excel,

делайте в цикле изменение данных порциями скажем тыщ по 10. Число можно варьировать.
27 ноя 09, 16:01    [7988854]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
iljy,

Правда помагает?
Обернуть в курсор и ццедить скажем диапазоны ID?

Или в 2005 курсоры уже не модно?
27 ноя 09, 16:11    [7988946]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Что-то в таком духе можно.
set rowcount 10000
while exists(select * from ParamPamPams where kind in (458, 807, 685, 686, 486, 487) )
  update ParamPamPams p set kind = 457 where kind in (458, 807, 685, 686, 486, 487)

Хотя сильно зависит от того, если ли на kind индекс.
27 ноя 09, 16:17    [7988997]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Гавриленко Сергей Алексеевич,

Спасибо.
Индекс есть.
27 ноя 09, 16:26    [7989072]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
Гавриленко Сергей Алексеевич,

А разве в таком случае каждый апдейт внутри цикла идет отдельной транзакцией?
Разве первый апдейт не держит локи до конца всего цикла?
27 ноя 09, 16:37    [7989170]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31173
Excel
Гавриленко Сергей Алексеевич,

А разве в таком случае каждый апдейт внутри цикла идет отдельной транзакцией?
Разве первый апдейт не держит локи до конца всего цикла?
Если не открыть свою транзакцию в начале и нет опции автостарта транзакций, то каждый апдейт отдельной транзакцией.
27 ноя 09, 17:11    [7989447]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
alexeyvg,

Спасибо. Никогда ничего подобного не читал. Ссылки не найдется? :)
27 ноя 09, 17:33    [7989618]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
http://msdn.microsoft.com/en-us/library/ms190612.aspx
27 ноя 09, 18:00    [7989823]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Гавриленко Сергей Алексеевич
Что-то в таком духе можно.
set rowcount 10000
while exists(select * from ParamPamPams where kind in (458, 807, 685, 686, 486, 487) )
  update ParamPamPams p set kind = 457 where kind in (458, 807, 685, 686, 486, 487)

Хотя сильно зависит от того, если ли на kind индекс.
Наверно, set rowcount уже некошерно.
U: update top(10000) ParamPamPams p set kind = 457 where kind in (458, 807, 685, 686, 486, 487);
if @@rowcount>0 goto U;
27 ноя 09, 20:00    [7990270]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Excel
Member

Откуда: UA, Kiev
Сообщений: 119
iap,
update top(10000) - абалдеть!
27 ноя 09, 20:03    [7990290]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Excel
iap,
update top(10000) - абалдеть!
А что, не работает?
27 ноя 09, 20:10    [7990315]     Ответить | Цитировать Сообщить модератору
 Re: Тяжелый апдейт в рабочее время  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33340
Блог
или так
update top(10000) ParamPamPams p set kind = 457 where kind in (458, 807, 685, 686, 486, 487);
go <количество подлежащих обновлению записей>/10000
27 ноя 09, 23:49    [7990728]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить