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

Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK.
Машина - 400 Cel,64Mb,15Gb UDMA66.
Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре?
Или я что-то не правильно делаю?
Мой ICQ# 71138906
Заранее благодарен.
14 май 00, 08:23    [2660]     Ответить | Цитировать Сообщить модератору
 Курсоры  [new]
wlad
Guest
Никакой нормальный человек не пользуется курсорами в MS SQL Server потому что они работают ну ооочень долго. Почему это происходит - отчасти из-за неправильно написанных курсоров, отчасти из-за самого SQL Servera.

SQL Sever сделан таким образом что, для курсоров пошли на компромисс - в ущерб скорости добавили функциональность.
Что же касается как привильно написать курсор - проблема стоит только в SQL Server 7.0, MS SQL Server 6.5 и ниже - проблемы нет - там только единственный способ определения курсоров, а именно самый долговыполгяющийся.

А вообще на вашем месте я бы читал книги - там все это написано.
14 май 00, 08:24    [2661]     Ответить | Цитировать Сообщить модератору
 От курсоров _нужно_ отказываться.  [new]
judge
Администратор

Откуда: SQL.ru
Сообщений: 5975
Блог
Wlad правильно заметил, что курсоры в SQL Server'е реализованы плохо - даже при среднем объеме данных время выполнения может быть очень большим.
На мой взгляд, необходимость использования курсоров возникает в основном тогда, когда нужно пробежаться по табличке (запросу) и выполнить определенное действие с текущей строчкой - посчитать сумму, обновить поля, создать другую запись и т.д.

Для реализации механизма еквивалентого по функциональности курсору, но выполняющегося в разы быстрее (не забывайте про индексы) можно воспользоваться следующим методом. Продемонстрирую на примере:
---------------
SELECT @rec_id = MIN(rec_id) - 1
FROM test_table

WHILE 1 = 1
BEGIN
SET ROWCOUNT 1
SELECT @rec_id = rec_id,
@qty = qty
FROM test_table
WHERE rec_id > @rec_id
ORDER BY rec_id
IF @@rowcount = 0
BEGIN
SET ROWCOUNT 0
BREAK
END
SET ROWCOUNT 0

SELECT @sum_qty = @sum_qty + @qty
END

------------------

В этом примере считается сумма по полю qty. Это просто для примера (конечно же это можно было выполнить простым запросом). Главная идея заключается в выборе из таблицы по одной записи:
SET ROWCOUNT 1

и дальше ограничиваем снизу ключ через
WHERE row_id > @row_id

не забудьте ORDER BY и вернуть SET ROWCOUNT 0

-----------

Успехов.
14 май 00, 08:26    [2662]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Явно открытый курсор в MS SQL  [new]
Goga-Gola
Guest
leonsa
Уважаемые Господа!
У меня вопрос такой:

Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK.
Машина - 400 Cel,64Mb,15Gb UDMA66.
Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре?
Или я что-то не правильно делаю?
Мой ICQ# 71138906
Заранее благодарен.



Машины выросли, а курсором многие пользуются?
15 дек 17, 15:38    [21037273]     Ответить | Цитировать Сообщить модератору
 Re: Явно открытый курсор в MS SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Goga-Gola
leonsa
Уважаемые Господа!
У меня вопрос такой:

Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK.
Машина - 400 Cel,64Mb,15Gb UDMA66.
Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре?
Или я что-то не правильно делаю?
Мой ICQ# 71138906
Заранее благодарен.
Многие, родившиеся, когда появилась эта тема, уже умерли!
Ещё даже Путин не был Президентом!


Машины выросли, а курсором многие пользуются?
15 дек 17, 17:26    [21037814]     Ответить | Цитировать Сообщить модератору
 Re: Явно открытый курсор в MS SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Даже сообщение моё глюкнуло:

Многие, родившиеся, когда появилась эта тема, уже умерли!
Ещё даже Путин не был Президентом!
15 дек 17, 17:28    [21037821]     Ответить | Цитировать Сообщить модератору
 Re: Явно открытый курсор в MS SQL  [new]
Goga-Gola
Guest
iap,

да, это самая первая тема форума. Тем она и привлекла мое внимание.
15 дек 17, 17:28    [21037826]     Ответить | Цитировать Сообщить модератору
 Re: Явно открытый курсор в MS SQL  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
Goga-Gola
да, это самая первая тема форума. Тем она и привлекла мое внимание.

это даже не некромания.
это геронтофилия
15 дек 17, 17:44    [21037874]     Ответить | Цитировать Сообщить модератору
 Re: Явно открытый курсор в MS SQL  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
Yasha123,

самый раз для пятничной темы, залезть в анналы форумных тем
15 дек 17, 18:06    [21037923]     Ответить | Цитировать Сообщить модератору
 Re: Явно открытый курсор в MS SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
Goga-Gola
iap,

да, это самая первая тема форума. Тем она и привлекла мое внимание.
Не, есть на день раньше
https://www.sql.ru/forum/563/pomogite-so-skriptom-pls
15 дек 17, 20:29    [21038255]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить