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


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