|
|
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Уважаемые Господа! У меня вопрос такой: Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK. Машина - 400 Cel,64Mb,15Gb UDMA66. Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре? Или я что-то не правильно делаю? Мой ICQ# 71138906 Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2000, 08:23:35 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Никакой нормальный человек не пользуется курсорами в MS SQL Server потому что они работают ну ооочень долго. Почему это происходит - отчасти из-за неправильно написанных курсоров, отчасти из-за самого SQL Servera. SQL Sever сделан таким образом что, для курсоров пошли на компромисс - в ущерб скорости добавили функциональность. Что же касается как привильно написать курсор - проблема стоит только в SQL Server 7.0, MS SQL Server 6.5 и ниже - проблемы нет - там только единственный способ определения курсоров, а именно самый долговыполгяющийся. А вообще на вашем месте я бы читал книги - там все это написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2000, 08:24:52 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
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.05.2000, 08:26:06 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
leonsaУважаемые Господа! У меня вопрос такой: Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK. Машина - 400 Cel,64Mb,15Gb UDMA66. Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре? Или я что-то не правильно делаю? Мой ICQ# 71138906 Заранее благодарен. Машины выросли, а курсором многие пользуются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 15:38:18 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Goga-GolaleonsaУважаемые Господа! У меня вопрос такой: Почему открытый курсор по таблице с 215 000 записями, в котором встроен, например, обычный счетчик строк, работает почти 1 минуту, в то время как функция SUM по сгруппированным данным (порядка 100)в той же таблице работает очень быстро (порядка 1 сек.), беру грязные данные NOLOCK. Машина - 400 Cel,64Mb,15Gb UDMA66. Т.е. получается так, что лучше несколько раз взять SUM в большой таблице, чем один раз просканировать всю таблицу и выполнить необходимые операции в открытом курсоре? Или я что-то не правильно делаю? Мой ICQ# 71138906 Заранее благодарен.Многие, родившиеся, когда появилась эта тема, уже умерли! Ещё даже Путин не был Президентом! Машины выросли, а курсором многие пользуются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 17:26:46 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Даже сообщение моё глюкнуло: Многие, родившиеся, когда появилась эта тема, уже умерли! Ещё даже Путин не был Президентом! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 17:28:25 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
iap, да, это самая первая тема форума. Тем она и привлекла мое внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 17:28:52 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Goga-Golaда, это самая первая тема форума. Тем она и привлекла мое внимание. это даже не некромания. это геронтофилия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 17:44:39 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Yasha123, самый раз для пятничной темы, залезть в анналы форумных тем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 18:06:00 |
|
||
|
Явно открытый курсор в MS SQL
|
|||
|---|---|---|---|
|
#18+
Goga-Golaiap, да, это самая первая тема форума. Тем она и привлекла мое внимание.Не, есть на день раньше http://www.sql.ru/forum/563/pomogite-so-skriptom-pls ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2017, 20:29:15 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39570473&tid=1690664]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
182ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 436ms |

| 0 / 0 |
