Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте! Вопрос такого плана: Что лучше использовать для прохода по записям в таблице и обработке каждой записи(с точки зрения быстродействия и вообще). Курсоры или такой к примеру вариант: временная таблица существует обязательно, а не создана для прохода именно по таблице declare @id as bigint select @id=id from #table while(@@ROWCOUNT>0) begin .... какая-то обработка .... delete from #table where id=@id select @id=id from #table end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2002, 16:13 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
курсор всегда будет медленее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2002, 18:27 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
А почему он будет медленней и как это узнать? Я такое уже слышал, а вот обьянение этому не видел. Я конечно и сам такое предполагаю. Но хотелось бы услышать обоснование хоть какое-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2002, 21:17 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
это из родной докуметации (BOL), почитай, там подробно расписано. Рекомендует, если есть возможность обойтись без курсора, то обходиться без него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 06:40 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
Абсолютно не согласен - в данном случае курсор будет всегда быстрее, причем не в один десяток раз. Сами вдумайтесь - курсор получается из select-а, т.е. операцией чтения. В приведенном же случае мало того, что вы каждый раз select-ом выбираете одну запись, так потом еще и вызываете неявную транзакцию и удаляете запись !!! Простой пример - что легче - купить в магазине килограм картошки и дома, сидя перед компом очистить ее или же каждый раз бегать в магазин за новой картофелиной ? Кстати совершенно недавно ради интереса в SQL2K сделал тестовую таблицу на миллион записей и в ХП просто прогнал по ней курсор, чтобы цикл не крутился в холостую поставил внутрь переменную счетчик, чтобы на выходе подтвердить, что все записи обработались. Работало меньше секунды. Другой ХП я сделал примерно такой же вариант обработки, как в предложенном примере. Устав ждать я просто прекратил запрос. Кстати после этого теста я изменил свое мнение о курсорах и не гнушаюсь ими пользоваться, когда это действительно оказывается эффективнее, чем обращение к любым операциям, вызывающим физическую запись данных в БД. Еще в догонку - насчет таблиц типа declare @Table table тоже обольщаться не стоит, запись в них происходит тоже не особенно быстро, чему я очень удивился, так как они вроде бы по BOL сидят в памяти и не участвуют в транзакциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 10:22 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
С точки зрения логики курсор должен работать быстрей, но на практике это нужно еще проверить. Меня на столько заинтерисовал вариант, что миллион записей прошел меньше секунды, что я буду это проверять и если это правда, то я должен буду изменить свое мнение по поводу курсоров(по крайней мере для такой цели, что нужна мне) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 12:51 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
Похоже, что вопрос можно снимать, для данного примера прохода по таблице курсор я вляется наилучшим вариантом. Я сделал проход по таблице в которой было всего 9194 записи с помощью курсора и с помощью данного метода. Так вот курсор это выполнил меньше чем за 1 сек, а данный метод описанный выше, делал это в течении 1 мин 40 сек. В общем я изменил свое мнени к курсорам. Машина Duron-650 256 mb, Windows AS Спасибо за совет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2002, 13:11 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
Но, видимо, быстродействие зависит еще и от того, как действия выполняются в курсоре или запросе. У меня в таблице на 40 тысяч записей курсор выполнял update 3,5 минуты, а запрос - около 1,5 минуты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2002, 14:00 |
|
||
|
Вопрос
|
|||
|---|---|---|---|
|
#18+
flider: мы рассматривали только вариант перелопачивания записей, предложенный автором темы. Естественно все что можно сделать запросом никогда не нужно делать курсором. Однако для ситуаций, когда действительно требуется пошаговая обработка записей, согласитесь, курсор является наилучшим и быстрым решением. Единственное, что я делаю, когда на MSSQL садяться люди, только что слезшие с БД индексно-последовательного доступа (FoxPro, Clipper, ...) - сразу предупреждаю, что за использование курсоров их ждет суровая кара, т.е. пытаюсь изменить их взгляд на обработку данных. Сначала правда они на меня обижаються, но потом говорят спасибо, так как уже сами могут трезво оценить ситуацию, когда действительно без курсора не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2002, 16:55 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32029903&tid=1822781]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 264ms |
| total: | 391ms |

| 0 / 0 |
