Para responder a las preguntas originales de Mile ...
avance rápido, solo lectura, cursores estáticos (cariñosamente conocido como "Manguera de bomberos cursor") suelen ser tan rápido o más rápido que una Tabla de temperatura equivalente y un bucle While porque dicho cursor no es más que una Tabla de temperatura y un bucle While que se ha optimizado un poco detrás de las escenas.
Para añadir a lo que Eric Z. Barba publicada en este hilo y de responder aún más la cuestión de ...
"¿Es todo lo dicho sobre no usar cursores realmente acerca de cómo evitar el uso de cursores cuando Los enfoques basados en conjuntos están disponibles, y el uso de cursores actualizables, etc. "
Sí. Con muy pocas excepciones, se necesita menos tiempo y menos código para escribir el código correcto basado en conjunto para hacer lo mismo que la mayoría de los cursores y tiene el beneficio adicional de utilizar muchos menos recursos y generalmente se ejecuta MUCHO más rápido que un cursor o un ciclo While. En términos generales, y con la excepción de ciertas tareas administrativas, deberían evitarse a favor de un código basado en conjuntos correctamente escrito. Hay, por supuesto, excepciones a cada "regla" pero, en el caso de los cursores, bucles While y otras formas de RBAR, la mayoría de las personas puede contar las excepciones con una mano sin usar todos los dedos. ;-)
También existe la noción de "RBAR Oculto". Este es un código que parece estar basado en conjuntos, pero en realidad no lo es. Este tipo de código "basado en conjuntos" es la razón por la cual ciertas personas han adoptado los métodos RBAR y dicen que están "OK". Por ejemplo, resolver el problema del total acumulado utilizando una subconsulta correlacionada agregada (SUM) con una desigualdad en él para generar el total acumulado no está realmente establecida en mi libro. En cambio, es RBAR con esteroides porque, para cada fila calculada, tiene que "tocar" repetidamente muchas otras filas a una tasa de N * (N + 1)/2. Eso se conoce como "unión triangular" y es al menos la mitad de malo que una unión cartesiana completa (unión cruzada o "unión cuadrada").
Aunque MS ha realizado algunas mejoras en cómo funcionan los cursores desde SQL Server 2005, el término "Fast Cursor" sigue siendo un oxímoron en comparación con el código escrito correctamente establecido. Eso también es cierto incluso en Oracle. Trabajé con Oracle durante 3 años en el pasado, pero mi trabajo consistía en mejorar el rendimiento del código existente. La mayoría de las mejoras realmente sustanciales se realizaron cuando convertí los cursores al código basado en conjuntos. Muchos trabajos que antes tardaban de 4 a 8 horas en ejecutarse se redujeron a minutos y, a veces, a segundos.
Si bien es cierto que los cursores se utilizan con éxito en Oracle PL/SQL, eso realmente no tiene relación con su uso en SQL Server. La última vez que utilicé Oracle, no se pudieron escribir instrucciones INSERT ... FROM o UPDATE ... FROM, por lo que se requería que utilizaras cursores. Los modelos de bloqueo también son completamente diferentes, así que no creo que la comparación sea justa. –
No, Simon. No es "desactualizado" o "incorrecto". Aunque MS puede haber mejorado la forma en que se manejan los cursores y salvo determinadas tareas administrativas, los cursores son necesariamente peores que los códigos escritos correctamente basados en conjuntos ... incluso en Oracle. –