powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос
9 сообщений из 9, страница 1 из 1
Вопрос
    #32029886
Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем здравствуйте!
Вопрос такого плана:
Что лучше использовать для прохода по записям в таблице и обработке каждой записи(с точки зрения быстродействия и вообще). Курсоры или такой к примеру вариант:
временная таблица существует обязательно, а не создана для прохода именно по таблице
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
...
Рейтинг: 0 / 0
Вопрос
    #32029892
Леша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
курсор всегда будет медленее
...
Рейтинг: 0 / 0
Вопрос
    #32029896
Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему он будет медленней и как это узнать? Я такое уже слышал, а вот обьянение этому не видел. Я конечно и сам такое предполагаю. Но хотелось бы услышать обоснование хоть какое-то.
...
Рейтинг: 0 / 0
Вопрос
    #32029903
Леша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это из родной докуметации (BOL), почитай, там подробно расписано. Рекомендует, если есть возможность обойтись без курсора, то обходиться без него.
...
Рейтинг: 0 / 0
Вопрос
    #32029913
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Абсолютно не согласен - в данном случае курсор будет всегда быстрее, причем не в один десяток раз. Сами вдумайтесь - курсор получается из select-а, т.е. операцией чтения. В приведенном же случае мало того, что вы каждый раз select-ом выбираете одну запись, так потом еще и вызываете неявную транзакцию и удаляете запись !!! Простой пример - что легче - купить в магазине килограм картошки и дома, сидя перед компом очистить ее или же каждый раз бегать в магазин за новой картофелиной ? Кстати совершенно недавно ради интереса в SQL2K сделал тестовую таблицу на миллион записей и в ХП просто прогнал по ней курсор, чтобы цикл не крутился в холостую поставил внутрь переменную счетчик, чтобы на выходе подтвердить, что все записи обработались. Работало меньше секунды. Другой ХП я сделал примерно такой же вариант обработки, как в предложенном примере. Устав ждать я просто прекратил запрос. Кстати после этого теста я изменил свое мнение о курсорах и не гнушаюсь ими пользоваться, когда это действительно оказывается эффективнее, чем обращение к любым операциям, вызывающим физическую запись данных в БД. Еще в догонку - насчет таблиц типа declare @Table table тоже обольщаться не стоит, запись в них происходит тоже не особенно быстро, чему я очень удивился, так как они вроде бы по BOL сидят в памяти и не участвуют в транзакциях.
...
Рейтинг: 0 / 0
Вопрос
    #32029924
Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения логики курсор должен работать быстрей, но на практике это нужно еще проверить. Меня на столько заинтерисовал вариант, что миллион записей прошел меньше секунды, что я буду это проверять и если это правда, то я должен буду изменить свое мнение по поводу курсоров(по крайней мере для такой цели, что нужна мне)
...
Рейтинг: 0 / 0
Вопрос
    #32029927
Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что вопрос можно снимать, для данного примера прохода по таблице курсор я вляется наилучшим вариантом. Я сделал проход по таблице в которой было всего 9194 записи с помощью курсора и с помощью данного метода. Так вот курсор это выполнил меньше чем за 1 сек, а данный метод описанный выше, делал это в течении 1 мин 40 сек. В общем я изменил свое мнени к курсорам. Машина Duron-650 256 mb, Windows AS
Спасибо за совет!
...
Рейтинг: 0 / 0
Вопрос
    #32029992
Фотография Flider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, видимо, быстродействие зависит еще и от того, как действия выполняются в курсоре или запросе. У меня в таблице на 40 тысяч записей курсор выполнял update 3,5 минуты, а запрос - около 1,5 минуты.
...
Рейтинг: 0 / 0
Вопрос
    #32030011
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flider:
мы рассматривали только вариант перелопачивания записей, предложенный автором темы. Естественно все что можно сделать запросом никогда не нужно делать курсором. Однако для ситуаций, когда действительно требуется пошаговая обработка записей, согласитесь, курсор является наилучшим и быстрым решением. Единственное, что я делаю, когда на MSSQL садяться люди, только что слезшие с БД индексно-последовательного доступа (FoxPro, Clipper, ...) - сразу предупреждаю, что за использование курсоров их ждет суровая кара, т.е. пытаюсь изменить их взгляд на обработку данных. Сначала правда они на меня обижаються, но потом говорят спасибо, так как уже сами могут трезво оценить ситуацию, когда действительно без курсора не обойтись.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]