Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
leonsa
Guest |
Уважаемые Господа! У меня вопрос такой: Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK. Машина - 400 Cel,64Mb,15Gb UDMA66. Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре? Или я что-то не правильно делаю? Мой ICQ# 71138906 Заранее благодарен. |
14 май 00, 08:23 [2660] Ответить | Цитировать Сообщить модератору |
wlad
Guest |
Никакой нормальный человек не пользуется курсорами в MS SQL Server потому что они работают ну ооочень долго. Почему это происходит - отчасти из-за неправильно написанных курсоров, отчасти из-за самого SQL Servera. SQL Sever сделан таким образом что, для курсоров пошли на компромисс - в ущерб скорости добавили функциональность. Что же касается как привильно написать курсор - проблема стоит только в SQL Server 7.0, MS SQL Server 6.5 и ниже - проблемы нет - там только единственный способ определения курсоров, а именно самый долговыполгяющийся. А вообще на вашем месте я бы читал книги - там все это написано. |
14 май 00, 08:24 [2661] Ответить | Цитировать Сообщить модератору |
judge Администратор Откуда: SQL.ru Сообщений: 6000 Блог |
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 года. |
Goga-Gola
Guest |
Машины выросли, а курсором многие пользуются? |
||
15 дек 17, 15:38 [21037273] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||||
15 дек 17, 17:26 [21037814] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Даже сообщение моё глюкнуло: Многие, родившиеся, когда появилась эта тема, уже умерли! Ещё даже Путин не был Президентом! |
15 дек 17, 17:28 [21037821] Ответить | Цитировать Сообщить модератору |
Goga-Gola
Guest |
iap, да, это самая первая тема форума. Тем она и привлекла мое внимание. |
15 дек 17, 17:28 [21037826] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
это даже не некромания. это геронтофилия |
||
15 дек 17, 17:44 [21037874] Ответить | Цитировать Сообщить модератору |
felix_ff Member Откуда: Moscow Сообщений: 1698 |
Yasha123, самый раз для пятничной темы, залезть в анналы форумных тем ![]() |
15 дек 17, 18:06 [21037923] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
https://www.sql.ru/forum/563/pomogite-so-skriptom-pls |
||
15 дек 17, 20:29 [21038255] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |