¿Qué es más rápido en SQL, while loop, procuración almacenada recursiva o Cursor? Quiero optimizar el rendimiento en un par de lugares en un procedimiento almacenado. El código que estoy optimizando formatea algunas cadenas para generar un archivo.¿Qué es más rápido en SQL, ciclo While, procuración almacenada recursiva o Cursor?
Respuesta
D) Ninguna de las anteriores.
Un método basado en conjuntos será casi siempre el método más rápido. Sin saber cuál es tu código real (o una aproximación cercana) es difícil decir si eso es posible o qué método sería el más rápido.
Su mejor opción es probar todos los métodos posibles que tiene y ver cuál es realmente el más rápido.
Tengo que enviar a un archivo de texto. No estoy seguro de cómo hacer la salida, excepto de forma iterativa, ya que tengo que formatear los campos antes de enviarlos al archivo. – Casey
use bcp y queryout, haga el formateo en la consulta, esto asume el servidor sql, la mayoría de los rdbms tienen una cosa similar – SQLMenace
Si desea mejorar el rendimiento, entonces necesita ver las operaciones basadas en SET. Mientras que el bucle y el cursor son básicamente lo mismo. SQL funciona en SETs no es un lenguaje de procedimiento, úsela como se pretende utilizar
El procedimiento almacenado recursivo es probable que sea el más lento, mientras que el bucle y los cursores no son mutuamente exclusivos. Las operaciones del cursor son bastante rápidas (IME), pero solo las he usado desde código externo (que no es SQL). Los otros carteles son correctos, si puede hacer su procesamiento de una manera orientada a conjuntos obtendrá el mejor rendimiento.
Esta puede ser la única publicación que realmente responde la pregunta y la acerta en la mayoría de los casos. En orden de rendimiento, sería: 1. Cursor de avance rápido (la mayoría de los cursores pueden ser FF), 2. Mientras que Loop, 3. SP recursivo. (Y Set Ops sería 0 en esa escala). – TTT
Aún no lo sé, pero quiere leer este libro.
http://www.amazon.com/Refactoring-SQL-Applications-Stephane-Faroult/dp/0596514972
Voy a asumir que está utilizando SQL Server.
En primer lugar, como alguien dijo en las declaraciones, los procesos almacenados recursivos, aunque son posibles, no son una buena idea en SQL Server debido al tamaño de la pila. Entonces, cualquier lógica profundamente recursiva se romperá. Sin embargo, si tiene 2-3 niveles de anidamiento en el mejor de los casos, puede intentar usar recursion o usar CTE, que también es un poco recursivo (SQL Server 2005 en adelante). Una vez que logra envolver su cabeza en CTE, es una técnica inmensamente útil. No he medido, pero nunca tuve problemas de rendimiento en los pocos lugares donde utilicé CTE.
Los cursores, por otro lado, son grandes cerdos de rendimiento, por lo que I (and half the internet) recomendaría no utilizarlos en el código que se llama con frecuencia. Pero como los cursores son más una estructura de programación clásica, similar a foreach
en C#, a algunas personas les resulta más fácil mirar, comprender y mantener el código SQL que utiliza cursores para la manipulación de datos, sobre una enrevesada monstruosidad SQL múltiple de selección interna, no es la peor idea usarlos en el código que se llamará de vez en cuando.
Hablando de while
, también transfiere la mentalidad de programación de una basada en conjuntos a una basada en procedimientos, por lo tanto, aunque es relativamente rápida y no consume muchos recursos, puede aumentar drásticamente la cantidad de manipulación de datos declaraciones que publicas en la base de datos en sí.
Para resumir, si tuviera que hacer un procedimiento almacenado complejo en el que el rendimiento es de suma importancia que iba a tratar:
- Usando enfoque basado en el set (selecciona interiores, combinaciones, sindicatos y tal)
- Uso de CTE (claro y manejable para un usuario experimentado, bit sombreado para un principiante)
- Utilizando declaraciones de flujo de control (si, mientras ...)
- Uso de cursores (código de procedimiento, fácil de seguir)
en ese orden.
Si el código se usa con mucha menos frecuencia, probablemente moveré 3 y 4 antes que 1 y 2, pero, nuevamente, solo para escenarios complejos que usan muchas tablas y muchas relaciones. Por supuesto, YMMV, así que probaría cualquier procedimiento que haga en un escenario del mundo real, para medir realmente el rendimiento, porque podemos hablar hasta que seamos azules en cuanto a que esto es rápido y lento, pero hasta obtienes medidas reales, no hay forma de saber si los cambios están mejorando o empeorando las cosas.
Y, no olvide, el código solo es tan rápido como sus datos. No hay sustitución para una buena indexación.
Hay una publicación de blog de 3 partes sobre cursores que vale la pena leer si tiene tiempo. También los evito como la peste, pero este blog me ha hecho verlos bajo una luz diferente ... bueno ... ¡ahora los enfurezco un poco pero todavía no los usaré!
Tome un vistazo a Cursors and How to Avoid Them que le dará ideas sobre cómo sustituir cursores con operaciones basadas SET
- 1. do-while es el ciclo más rápido en php?
- 2. ¿Qué ciclo es más rápido, mientras o para?
- 3. En Perl, ¿es un ciclo while generalmente más rápido que un ciclo for?
- 4. ¿Qué es más rápido EN O?
- 5. ¿Qué es más eficiente en Javascript: while o for statements?
- 6. servidor SQL 'en' o 'o' - que es más rápido
- 7. ¿Qué es más rápido: Union o Concat?
- 8. ¿Qué es más rápido, XPath o Regexp?
- 9. ¿Qué es más rápido: JDBC o JNDI?
- 10. ¿Qué es más rápido, INSTR o LIKE?
- 11. ¿qué es más rápido: recrear o borrar()?
- 12. ¿Qué es más rápido? Comparación o asignación?
- 13. escribe o imprime, ¿qué es más rápido?
- 14. que es más rápido? Declaración o PreparedStatement
- 15. Pitón eficiente y rápido While while while sleep()
- 16. SQL & PHP - ¿Cuál es más rápido mysql_num_rows() o 'select count()'?
- 17. Double.TryParse o Convert.ToDouble - ¿Qué es más rápido y más seguro?
- 18. jQuery ¿qué es más rápido: selectores o métodos?
- 19. ¿Por qué el bucle en range() en Python es más rápido que usar un bucle while?
- 20. Cursores vs. ciclo while - SQLServer
- 21. En MySQL, ¿es más rápido eliminar e insertar o es más rápido actualizar las filas existentes?
- 22. ¿Qué pasa con este ciclo while?
- 23. ¿Es php o sql más rápido para las operaciones básicas?
- 24. ¿Por qué usar un ciclo "do while"?
- 25. ¿Qué es children() o find() más rápido en jQuery?
- 26. ¿qué es más rápido en iPhone? XML pList o JSON?
- 27. ¿Qué es más rápido, EXISTE antes o después del INSERT?
- 28. ¿Qué es más rápido? Struct array o DataTable
- 29. ¿Por qué mi Scala tail-recursión es más rápida que el ciclo while?
- 30. Servidor Sql imprimir filas afectadas durante el ciclo while
es probable que esto dependerá de qué base de datos que está utilizando ... – Artelius
depende de lo que es dentro de eso. cursor es la forma de moverse a lo largo de las filas, mientras que es la estructura de control. olvidarse de la recursividad, la profundidad de la pila está limitada por 32. – Andrey
Estoy generando un archivo desde sql. No estoy al tanto de una forma de hacerlo. – Casey