Pregunta

Tengo que calcular un valor que involucra datos de varias tablas. Me preguntaba si el uso de un procedimiento almacenado con cursores ofrecería una ventaja de rendimiento en comparación con la lectura de los datos en un conjunto de datos (utilizando procedimientos almacenados de selección simple) y luego recorrer los registros? El conjunto de datos no es grande, consta de 6 tablas, cada una con aproximadamente 10 registros, principalmente GUID, varios campos nvarchar (100), una columna flotante y un nvarchar (máx.).

¿Fue útil?

Solución

Eso probablemente dependerá del conjunto de datos que pueda recuperar (cuanto más grande sea el conjunto, más lógico será realizar dentro de SQL Server en lugar de transmitirlo), pero tiendo a pensar que si está buscando realice cálculos, hágalo en su código y lejos de sus procedimientos almacenados. Si necesita usar cursores para reunir los datos, hágalo, pero utilícelos para hacer cálculos y otras funciones de no recuperación que creo que deberían evitarse.

Editar : este Responder a otra pregunta relacionada le dará algunas ventajas y desventajas a los cursores y los bucles. Esta respuesta parece estar en conflicto con mi afirmación anterior (lea más arriba) sobre la escala. Parece sugerir que cuanto más grande seas, más querrás moverlo a tu código en lugar del procedimiento almacenado.

Otros consejos

alternativa a un cursor

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

Los cursores deberían ser más rápidos, pero si tiene muchos usuarios ejecutando esto, consumirá los recursos de su servidor. Tenga en cuenta que tiene un lenguaje de codificación más potente al escribir bucles en .Net en lugar de SQL.

Hay muy pocas ocasiones en las que un cursor no se puede reemplazar utilizando el SQL basado en un conjunto estándar. Si está realizando esta operación en el servidor, es posible que pueda utilizar una operación basada en un conjunto. ¿Más detalles sobre lo que estás haciendo?

Si decide usar un cursor, tenga en cuenta que un cursor de solo lectura de FAST_FORWARD le dará el mejor rendimiento y asegúrese de usar la declaración de desasignación para liberarlo. Consulte aquí para obtener sugerencias sobre el cursor

Los cursores deberían ser más rápidos (a menos que estés haciendo algo extraño en SQL y no en ADO.NET).

Dicho esto, a menudo he encontrado que los cursores se pueden eliminar con un poco de trabajo de piernas. ¿Cuál es el procedimiento que debes hacer?

Saludos,
Eric

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top