SQL Server - Курсор SQL против ADO.NET - PullRequest
2 голосов
/ 29 апреля 2009

Мне нужно вычислить значение, включающее данные из нескольких таблиц. Мне было интересно, даст ли использование хранимой процедуры с курсорами преимущество в производительности по сравнению со считыванием данных в набор данных (с использованием простых хранимых процедур выбора) и последующим циклическим просмотром записей? Набор данных не большой, он состоит из 6 таблиц, каждая из которых содержит около 10 записей, в основном GUID, несколько полей nvarchar (100), столбец с плавающей запятой и nvarchar (max).

Ответы [ 4 ]

2 голосов
/ 29 апреля 2009

Это, вероятно, будет зависеть от набора данных, который вы можете получить обратно (чем больше набор, тем более логичным может быть выполнение внутри SQL Server вместо его передачи), но я склонен думать, что если вы ищете выполнять вычисления, делать это в своем коде и вдали от ваших хранимых процедур. Если вам нужно использовать курсоры для объединения данных, пусть будет так, но, используя их для выполнения вычислений и других функций, не связанных с поиском, я думаю, что следует избегать этого.

Редактировать : Этот Ответ на другой связанный с этим вопрос даст некоторые плюсы и минусы курсорам вместо циклических циклов. Этот ответ может показаться противоречащим моему предыдущему утверждению (см. Выше) о масштабировании. Похоже, что чем больше вы получаете, тем больше вы, вероятно, захотите перенести его в свой код, а не в хранимую процедуру.

1 голос
/ 29 апреля 2009

альтернатива курсору

declare @table table (Fields int)
declare @count int
declare @i

insert inot @table (Fields)
select Fields
from Table


select @count = count(*) from @table

while (@i<=@count)
begin


--whatever you need to do
set @i = @i + 1

end
1 голос
/ 29 апреля 2009

Курсоры должны быть быстрее, но если у вас много пользователей, запускающих это, это израсходует ресурсы вашего сервера. Имейте в виду, что при написании циклов в .Net вместо SQL у вас есть более мощный язык кодирования.

В очень редких случаях курсор не может быть заменен стандартным набором SQL. Если вы выполняете эту операцию на сервере, вы можете использовать операцию на основе набора. Еще какие-нибудь подробности о том, что вы делаете?

Если вы решите использовать курсор, помните, что курсор FAST_FORWARD только для чтения даст вам наилучшую производительность, и убедитесь, что вы используете оператор deallocate для его освобождения. См. здесь для подсказок курсора

0 голосов
/ 29 апреля 2009

Курсоры должны быть быстрее (если вы не делаете что-то странное в SQL, а не в ADO.NET).

Тем не менее, я часто обнаруживал, что курсоры могут быть устранены с небольшим трудом. Какую процедуру вам нужно сделать?

Приветствия
Eric

...