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

StackOverflow https://stackoverflow.com/questions/50346

  •  09-06-2019
  •  | 
  •  

Pregunta

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

¿Fue útil?

Solución

Otros consejos

Ronda 1: puede iniciar un seguimiento del generador de perfiles y comparar los tiempos de ejecución.

Para la mayoría de las personas, la mejor manera 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 tiempo cuánto tiempo lleva el uso de procedimientos almacenados versus nHibernate.Una vez que tengas los resultados, entrégaselos y la mayoría de las personas escépticas deberían ceder ante la evidencia.

Sólo 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 se realizan en tablas con cientos de miles o filas, cree dicho entorno de prueba.

En segundo lugar, iguale todo lo demás excepto el uso de una consulta generada por nHibernate y una llamada s'proc.Con suerte, podrá ejecutar la prueba simplemente cambiando un proveedor.

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

El problema aquí es que usted ha aceptado la carga de la prueba.Es poco probable que puedas hacer cambiar de opinión a alguien de esa manera.Nos guste o no, las personas (incluso los programadores) son demasiado emocionales para dejarse llevar fácilmente por la lógica.Debes devolverle la carga de la prueba, lograr que te convenza de lo contrario, y eso lo obligará a investigar y descubrir la respuesta por sí mismo.

Un mejor argumento para utilizar procedimientos almacenados es la seguridad.Si utiliza solo procedimientos almacenados, con No SQL dinámico, puede deshabilitar los permisos SELECCIONAR, INSERTAR, ACTUALIZAR, ELIMINAR, ALTERAR y CREAR 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 las inyecciones de primer orden.

Mídelo, pero en un punto de referencia que no sea un 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 en comparación con los otros costos en los que incurre su código:realmente recuperar datos, convertirlos, mostrarlos, etc.Sin mencionar que usar procedimientos almacenados equivale a distribuir su lógica en su aplicación. y su base de datos sin control de versiones significativo, pruebas unitarias o soporte de refactorización en este último.

Compárelo usted mismo.Escriba una clase de banco de pruebas que ejecute un procedimiento almacenado de muestra unos cientos de veces y ejecute el código NHibernate la misma cantidad de veces.Compare el tiempo de ejecución promedio y mediano de cada método.

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

La diferencia a largo plazo podría ser que los procedimientos almacenados son muchísimo más fáciles de administrar y ajustar para un DBA, mientras que cientos de consultas diferentes que deben extraerse de los seguimientos del perfilador son una pesadilla.

He tenido esta discusión muchas veces.
Casi siempre termino eligiendo un dba realmente bueno, ejecutando un proceso y un fragmento de código con el generador de perfiles en ejecución, y obtengo que el dba muestre que los resultados son tan cercanos que son insignificantes.

Mídelo.

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

Puede que tenga razón para el caso de uso específico en el que está pensando.Un procedimiento almacenado probablemente se ejecutará más rápido para algún conjunto complejo de SQL, que puede ajustarse arbitrariamente.Sin embargo, algo que se obtiene de cosas como la hibernación es el almacenamiento en caché.Esto puede resultar mucho más rápido durante la vida útil de su aplicación real.

La capa adicional de abstracción hará que sea más lento que una llamada pura a un sproc.Solo por el hecho de que tiene asignaciones adicionales en el montón administrado y pulsaciones y salidas adicionales de la pila de llamadas, la verdad del asunto es que es más eficiente llamar a un sproc que tener un ORM que cree la consulta, independientemente de qué tan bueno sea el ORM lo es.

Qué tan lento, si es que es siquiera mensurable, es discutible.A esto también ayuda el hecho de que la mayoría de los ORM tienen un mecanismo de almacenamiento en caché para evitar realizar la consulta en absoluto.

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

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