2008-09-08 6 views

Respuesta

5

Para la mayoría de la gente, la mejor manera de convencer a ellos es para "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.

8

Ronda 1 - Se puede iniciar una traza del analizador y comparar los tiempos de ejecución.

1

medirlo, pero de una manera no-micro de referencia, es decir, algo que representa las operaciones reales en el 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 a través de su aplicación y su base de datos sin control de versiones significativo, pruebas unitarias o soporte de refactorización en este último.

+0

Tengo toda mi base de datos bajo control de fuente de fuente efectiva usando VSTS DB Edition. Creo que en el pasado podría haber agregado, pero las herramientas se están poniendo al día. – JoshBerke

1

Comparativa de referencia 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.

1

Es igual de rápido si la consulta es el mismo 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 mucho, muchas veces más fáciles de manejar y sintonizar para un DBA, mientras que cientos de consultas diferentes que deben obtenerse de los rastreos de los perfiles son una pesadilla.

1

que he tenido este argumento muchas veces.
Casi siempre terminan agarrando una muy buena dba, y la ejecución de un proc y un trozo de código con el perfilador en marcha, y obtener el dba para demostrar que los resultados están tan cerca de su insignificante.

+0

Es cierto, a menos que tenga mucha lógica incorporada. Por ejemplo, si tiene un bucle que extrae un rango de facturas, entonces para cada factura actualiza las líneas de factura según algunos criterios, será casi definitivamente más rápido que proc ... simplemente porque no necesita presionar los datos seleccionados a través del cable. –

+0

las actualizaciones en un bucle, con nhibernate, son más rápidas porque no las envía en el cable 1 a la vez. donde como un bucle en un proceso es altamente ineficiente. – DevelopingChris

0

Mídelo.

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

0

Él puede estar correcto para el caso de uso específico 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.

2

El problema aquí es que ha 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, con no 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.

+0

Me gusta su táctica. Tiene razón: convencer a la gente mientras acepta la carga de la prueba no lo llevará a ninguna parte. –

5

Sólo añadirí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 es 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, hacer que todo lo demás igual, excepto por el uso de un NHibernate genera consulta y una llamada s'proc. Esperemos que pueda ejecutar la prueba simplemente cambiando un proveedor.

Por último, se dan cuenta que por lo general hay mucho más en juego que acaba de procedimientos almacenados vs. ORM. Con esto en mente la prueba debe mirar todos los factores: tiempo de ejecución, el consumo de memoria, escalabilidad, capacidad de depuración, etc.

0

La capa adicional de abstracción hará que sea más lento que una llamada a un procedimiento almacenado pura. 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.

Cómo lento, si es incluso medible, 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.

0

Incluso si el procedimiento almacenado es 10% más rápido (probablemente no lo es), es posible que desee que 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.

Cuestiones relacionadas