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

Откуда:
Сообщений: 39
Помогите оптимизировать 10 млн записей

declare @ZakCancel int ,
@ZakCancelAll int
set @ZakCancel = 0
set @ZakCancelAll = 0
DECLARE curs CURSOR
FOR
SELECT ZakCancel, ZakCancelAll FROM ZakOnline WHERE ZakCancelAll = @ZakCancelAll
OPEN curs
FETCH NEXT FROM curs into @ZakCancel, @ZakCancelAll
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE ZakOnline SET ZakCancel = @ZakCancel
WHERE ZakCancelAll = @ZakCancelAll
FETCH NEXT FROM curs into @ZakCancel, @ZakCancelAll
END
CLOSE curs
DEALLOCATE curs
GO

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) Jun 17 2016 19:14:09 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
25 окт 16, 11:30    [19818997]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Зачем курсор? Что сделать надо?

Сообщение было отредактировано: 25 окт 16, 11:33
25 окт 16, 11:32    [19819006]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
terra_1231,

зачем оптимизировать этот бред?
Я даже про курсор промолчу...
25 окт 16, 11:34    [19819019]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
o-o
Guest
Гавриленко Сергей Алексеевич
Зачем курсор? Что сделать надо?

зэков истребляют, по одному и массово: @ZakCancel, @ZakCancelAll
25 окт 16, 11:36    [19819029]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
terra_1231
Member

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

где ZakCancelAll = 0 обновить ZakCancel = 0
25 окт 16, 11:50    [19819112]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
terra_1231
Member

Откуда:
Сообщений: 39
o-o,

это заказы )))))
25 окт 16, 11:50    [19819117]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
iap
Member

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

где ZakCancelAll = 0 обновить ZakCancel = 0
Оставьте только ваш собственный UPDATE.
Уберите курсор и цикл. Совсем.
25 окт 16, 11:53    [19819132]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
o-o
Guest
terra_1231,
UPDATE ZakOnline SET ZakCancel = @ZakCancel
WHERE ZakCancelAll = @ZakCancelAll 

?
25 окт 16, 11:57    [19819160]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
terra_1231
Member

Откуда:
Сообщений: 39
o-o,

declare @ZakCancel int ,
@ZakCancelAll int
set @ZakCancel = 0
set @ZakCancelAll = 0
BEGIN
UPDATE ZakOnline SET ZakCancel = @ZakCancel
WHERE ZakCancelAll = @ZakCancelAll
END
25 окт 16, 11:59    [19819171]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
terra_1231,

BEGIN, END - зачем?
25 окт 16, 12:01    [19819182]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Вчерашней терре надо было 2 млн и вариант подошел :) У вас там что, группа под одним именем работает?
25 окт 16, 12:15    [19819252]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
terra_1231
Member

Откуда:
Сообщений: 39
Всем спасибо разобрался ))))
25 окт 16, 12:30    [19819361]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
terra_1231
Member

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

Еще вопрос а как сделать чтобы обновлялись по 100 строк через СТЕ ?
Пример плз
declare @ZakCancel int ,
@ZakCancelAll int
set @ZakCancel = 0
set @ZakCancelAll = 0
BEGIN
UPDATE ZakOnline SET ZakCancel = @ZakCancel
WHERE ZakCancelAll = @ZakCancelAll
END
25 окт 16, 12:52    [19819459]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
.Anatoly.
Member

Откуда: Екатеринбург
Сообщений: 310
1)Так ваш запрос будет смотреться приятней.
declare @ZakCancel int = 0, @ZakCancelAll int = 0;
UPDATE ZakOnline 
  SET ZakCancel = @ZakCancel
  WHERE ZakCancelAll = @ZakCancelAll 


2)Если хотите обновить не более ста строчек, то можно использовать top. Если хотите обновить все строки, но не более, чем 100 за раз, то можно использовать top + while

declare @ZakCancel int = 0, @ZakCancelAll int = 0;
select 'start'

while @@rowcount>0
UPDATE top (100) ZakOnline 
  SET ZakCancel = @ZakCancel
  WHERE ZakCancelAll = @ZakCancelAll 
25 окт 16, 15:26    [19820279]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
.Anatoly.
Если хотите обновить все строки, но не более, чем 100 за раз, то можно использовать top + while

declare @ZakCancel int = 0, @ZakCancelAll int = 0;
select 'start'

while @@rowcount>0
UPDATE top (100) ZakOnline 
  SET ZakCancel = @ZakCancel
  WHERE ZakCancelAll = @ZakCancelAll 

ага, и будет у вас нормальный такой вечный цикл.
25 окт 16, 15:49    [19820387]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
.Anatoly.
Member

Откуда: Екатеринбург
Сообщений: 310
iljy, в данном случае, конечно, нужно добавить условие, которое бы отсеевало, обновленные ранее строки. Например ZakCancel != @ZakCancel
25 окт 16, 15:53    [19820411]     Ответить | Цитировать Сообщить модератору
 Re: Долго работает запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
.Anatoly.
iljy, в данном случае, конечно, нужно добавить условие, которое бы отсеевало, обновленные ранее строки. Например ZakCancel != @ZakCancel


Его всегда надо добавлять, просто для того, чтобы не заставлять сервер обрабатывать строки, в которых и так все в порядке, а то он же дурак, ему сказали обновить - он и обновит, со всеми вытекающими (логирование, блокировки, проверка ограничений, вызов триггеров и т.п.).
25 окт 16, 16:00    [19820463]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить