tipos salida resueltos procedimientos procedimiento parametros para mostrar fecha ejercicios ejemplo ejecutar datos con almacenados almacenado sql stored-procedures orm

salida - procedimiento almacenado sql server select



¿Por qué NHibernate genera el SQL parametrizado tan rápido como un procedimiento almacenado? (14)

Uno de mis compañeros de trabajo afirma que, aunque la ruta de ejecución está en caché, no hay forma de que el SQL parametrizado generado desde un ORM sea tan rápido como un procedimiento almacenado. ¿Alguna ayuda con este desarrollador obstinado?


Él puede ser correcto para el caso de uso específico en el que está pensando. Un procedimiento almacenado probablemente se ejecutará más rápido para algunos conjuntos complejos de SQL, que pueden ajustarse arbitrariamente. Sin embargo, algo que obtienes de cosas como Hibernate es el almacenamiento en caché. Esto puede ser mucho más rápido durante la vida de su aplicación real.



Comparativa de usted mismo. Escriba una clase testbed que ejecute un procedimiento almacenado muestreado unos cientos de veces, y ejecute el código NHibernate la misma cantidad de veces. Compara el promedio y el tiempo medio de ejecución de cada método.


El problema aquí es que has aceptado la carga de la prueba. Es poco probable que cambies la mente de alguien así. Nos guste o no, las personas, incluso los programadores, son demasiado emocionales para ser fácilmente influidos por la lógica. Debe volver a cargarle la carga de la prueba, hacer que lo convenza de lo contrario, y eso lo obligará a investigar y descubrir la respuesta por sí mismo.

Un mejor argumento para usar procedimientos almacenados es la seguridad. Si usa solo procedimientos almacenados, sin sql dinámico, puede deshabilitar los permisos SELECT, INSERT, UPDATE, DELETE, ALTER y CREATE para el usuario de la base de datos de la aplicación. Esto lo protegerá contra la mayoría de las inyecciones SQL de segundo orden, mientras que las consultas parametrizadas solo son efectivas contra la inyección de primer orden.


Es igual de rápido si la consulta es la misma cada vez. Sql Server 2005 almacena en caché los planes de consulta en el nivel de cada instrucción en un lote, independientemente de dónde provenga el SQL.

La diferencia a largo plazo podría ser que los procedimientos almacenados son muchos, muchas veces más fáciles de manejar y sintonizar para un DBA, mientras que cientos de consultas diferentes que tienen que obtenerse de los rastreos de los perfiles son una pesadilla.


He tenido este argumento muchas veces.
Casi siempre termino cogiendo un dba realmente bueno y ejecutando un proceso y un código con el generador de perfiles en ejecución, y obtengo que el dba demuestre que los resultados son tan insignificantes.


La capa adicional de abstracción hará que sea más lenta que una llamada pura a un sproc. Simplemente por el hecho de que tiene asignaciones adicionales en el montón gestionado, y empuja y saca de la pila de llamadas, la verdad del asunto es que es más eficiente llamar a un sproc para que un ORM cree la consulta, independientemente de cuán buena sea la ORM es.

Qué lento, si es incluso mensurable, es discutible. Esto también es ayudado por el hecho de que la mayoría de los ORM tienen un mecanismo de caché para evitar hacer la consulta.


Mídalo, pero en un punto de referencia no micro, es decir, algo que represente operaciones reales en su sistema. Incluso si hubiera un pequeño beneficio de rendimiento para un procedimiento almacenado, será insignificante frente a los otros costos en los que incurre su código: recuperar datos, convertirlos, mostrarlos, etc. Sin mencionar que usar procedimientos almacenados equivale a propagar su lógica sobre su aplicación y su base de datos sin control significativo de versiones, pruebas unitarias o soporte de refactorización en este último.


Mídelo.

Realmente, cualquier discusión sobre este tema es probablemente inútil hasta que lo hayas medido.


Para la mayoría de las personas, la mejor forma de convencerlos es "mostrarles la prueba". En este caso, crearía un par de casos de prueba básicos para recuperar el mismo conjunto de datos, y luego el tiempo que lleva usar procedimientos almacenados versus NHibernate. Una vez que tenga los resultados, entrégueselas y la mayoría de las personas escépticas deberían ceder a la evidencia.


Ronda 1: puede iniciar una traza del perfilador y comparar los tiempos de ejecución.


Solo agregaría un par de cosas a la respuesta de Rob:

Primero, asegúrese de que la cantidad de datos involucrados en los casos de prueba sea similar a los valores de producción. En otras palabras, si sus consultas normalmente son contra tablas con cientos de miles o filas, cree un entorno de prueba.

En segundo lugar, haga que todo lo demás sea igual, excepto por el uso de una consulta generada nHibernate y una llamada s''proc. Esperemos que pueda ejecutar la prueba simplemente cambiando un proveedor.

Finalmente, tenga en cuenta que generalmente hay mucho más en juego que los procedimientos almacenados versus ORM. Con esto en mente, la prueba debe considerar todos los factores: tiempo de ejecución, consumo de memoria, escalabilidad, capacidad de depuración, etc.



Incluso si el procedimiento almacenado es un 10% más rápido (probablemente no lo sea), es posible que desee preguntarse cuánto realmente importa. Lo que realmente importa al final es cuán fácil es escribir y mantener el código para su sistema. Si está codificando una aplicación web y todas sus páginas vuelven en 0,25 segundos, el tiempo extra ahorrado mediante el uso de procedimientos almacenados es insignificante. Sin embargo, puede haber muchas ventajas adicionales de usar un ORM como NHibernate, que sería extremadamente difícil de duplicar utilizando solo procedimientos almacenados.