Usando SQL 2005/2008¿Qué es una alternativa a los cursores para el bucle de sql?
Tengo que usar un cursor hacia adelante, pero no quiero sufrir un bajo rendimiento. ¿Hay una forma más rápida de bucle sin usar cursores?
Usando SQL 2005/2008¿Qué es una alternativa a los cursores para el bucle de sql?
Tengo que usar un cursor hacia adelante, pero no quiero sufrir un bajo rendimiento. ¿Hay una forma más rápida de bucle sin usar cursores?
Puede hacer un bucle WHILE
, sin embargo, debe buscar lograr una operación más basada en conjuntos ya que cualquier cosa en SQL que sea iterativa está sujeta a problemas de rendimiento.
¿Mientras que el bucle es realmente una parte del Cursor ??? – goofyui
Creo que @Dustin está diciendo que si puede hacer esto usando operaciones basadas en conjuntos, el bucle podría ser completamente innecesario. – DaveE
y @DavE, es posible que ambos tengan razón. ¿Qué estás tratando de explicar exactamente por Set Operators? ¡Estoy seguro de que las consultas recursivas pueden hacerlo ...! – goofyui
Neil, gracias ..! Creo que tienes razón ¿Puedes complacer alguna sintaxis como Sample? – goofyui
Hay ejemplos en el enlace: o) –
No es preciso decir "cursores afectan al rendimiento de SQL". Ciertamente tienen una tendencia a, pero mucho de eso tiene que ver con la forma en que la gente los usa.
La primera opción es tratar de encontrar un enfoque basado en conjuntos para el problema.
Si lógicamente no hay un enfoque basado en conjunto, y la consulta para el Cursor está golpeando tablas reales (no Temp), utilice la palabra clave STATIC que colocará los resultados de la instrucción SELECT en una Tabla Temp y por lo tanto no bloqueará las tablas base de la consulta mientras itera por los resultados. El uso de STATIC no ayudará si necesita ser sensible a los registros que podrían desaparecer mientras procesa el conjunto de resultados, pero ese es un punto discutible si está considerando convertir un bucle WHILE en una Tabla Temp (ya que tampoco conocerá los cambios) a los datos subyacentes).
http://www.sqlbook.com/SQL/Avoiding-using-SQL-Cursors-20.aspx - ¡Encontré un artículo sobre cómo reemplazar los cursores por while loop ..! Como tú/@ Dave mencionaste. De nuevo, ¡aquí estamos creando una tabla de temperatura ...! – goofyui
No necesariamente estoy diciendo que cree una tabla temporal. Estoy diciendo que el uso de la palabra clave STATIC almacenará automáticamente los resultados de la consulta del Cursor en una tabla temporal y, por lo tanto, no bloqueará ninguna de las tablas en la consulta. Valdría la pena explorar esta opción de simplemente agregar una sola palabra "ESTÁTICA" a su código para ver si obtiene la ganancia de rendimiento deseada antes de rediseñar el código para tener un ciclo WHILE. –
Según lo que desee, puede utilizar una tabla de recuento.
Jeff Moden tiene un excelente artículo sobre tablas de conteo Here
Común expresiones de tabla sería una buena alternativa como se sugiere @Neil. He aquí un ejemplo de Adventureworks:
WITH cte_PO AS
(
SELECT [LineTotal]
,[ModifiedDate]
FROM [AdventureWorks].[Purchasing].[PurchaseOrderDetail]
),
minmax AS
(
SELECT MIN([LineTotal]) as DayMin
,MAX([LineTotal]) as DayMax
,[ModifiedDate]
FROM cte_PO
GROUP BY [ModifiedDate]
)
SELECT * FROM minmax ORDER BY ModifiedDate
aquí es el superior pocas líneas de lo que devuelve:
DayMin DayMax ModifiedDate
135.36 8847.30 2001-05-24 00:00:00.000
129.8115 25334.925 2001-06-07 00:00:00.000
No utilice un cursor, en lugar de buscar una solución basada en el conjunto. Si no puede encontrar una solución basada en conjuntos ... ¡aún no use un cursor! Publique detalles de lo que intenta lograr, alguien podrá encontrar una solución basada en conjuntos para usted.
Tengo que usar un cursor hacia adelante, pero no quiero sufrir un bajo rendimiento. ¿Hay una forma más rápida de bucle sin usar cursores?
Esto depende de lo que haga con el cursor.
Casi todo se puede reescribir utilizando operaciones basadas en conjuntos, en cuyo caso los bucles se realizan dentro del plan de consulta y, dado que no implican un cambio de contexto, son mucho más rápidos.
Sin embargo, hay algunas cosas en las que SQL Server
simplemente no es bueno, como calcular valores acumulativos o unir rangos de fechas.
Este tipo de consultas se pueden hacer más rápido el uso de un CURSOR
:
Pero de nuevo, esta es una excepción muy rara, y normalmente una forma basada en el conjunto tiene un mejor rendimiento.
Si publicó su consulta, probablemente podríamos optimizarla y deshacerse de un CURSOR
.
Puede haber algunos casos en los que se puede usar Tally tables. Podría ser una buena alternativa de loop y cusrors pero recuerda que no se puede aplicar en todos los casos. Puede encontrar un caso bien explicativo here
¡Depende completamente de lo que está tratando de hacer! Tal vez darnos una pista para que podamos darle una respuesta que tenga sentido para su situación. – Oded
No soy yo, mi gerente no quiere que use cursores. ¡Eventualmente estoy buscando reemplazar el cursor por bucle ...! – goofyui
Me refiero a la tarea específica para la que crees que necesitas cursores. Explica qué es eso y se puede dar una respuesta útil. – Oded