2008-10-24 20 views
28

Estoy escuchando el Podcast de Hanselminutes; "StackOverflow utiliza ASP.NET MVC - Jeff Atwood y su equipo técnico". Durante el curso del Podcast están hablando de SQL Server y dicen algo como "Los días del procedimiento almacenado se han terminado".Procedimientos almacenados - Fin de días

Ahora no soy un DBA, pero esto me ha tomado un poco por sorpresa. Siempre asumí que los SP eran el camino a seguir por la velocidad (a medida que se cumplen) y la seguridad, sin mencionar la escalabilidad y la facilidad de mantenimiento. Si este no es el caso y los SP están en sus últimas etapas, ¿qué los reemplazará o qué deberíamos estar haciendo en el futuro?

+0

que era un buen podcast. Publicarlo como un comentario porque es irrelevante. – BBetances

+0

Enlace al podcast: http://www.hanselman.com/blog/HanselminutesPodcast134StackOverflowUsesASPNETMVCJeffAtwoodAndHisTechnicalTeam.aspx – gsk

Respuesta

22

En los sistemas modernos, las consultas parametrizadas se compilan y almacenan en caché en el servidor, por lo que son tan rápidas como un procedimiento almacenado. Ellos tienen la mayoría de las mismas características de seguridad también.

Para bases de datos que sirven una sola aplicación, tiene más sentido tener la lógica de consulta allí en la ubicación relevante en el código. Si nada más hace que sea más fácil hacer control de fuente. Si mantiene los procedimientos almacenados en el servidor, el seguimiento de ellos puede convertirse rápidamente en un desastre. Además, si está utilizando una herramienta ORM, puede que no tenga mucho en el camino de SQL real de todos modos.

Si su base de datos sirve varias aplicaciones diferentes, entonces aún puede desear usar procedimientos almacenados para hacer cumplir las reglas comerciales entre aplicaciones.

+0

Los SP acordados son una bendición cuando tiene varias aplicaciones en varios idiomas (por lo tanto, no puede compartir el código entre ellas). –

+0

, pero ¿quién escribe un sistema donde los procedimientos almacenados solo realizan consultas? ¿Qué haces para las actualizaciones? o para actualizar los efectos secundarios (sin desencadenantes, que por supuesto todavía apestan ;-)) –

+0

"consultas" se refiere a insertar, actualizar y eliminar, entre otros. –

9

SPs son probablemente el camino a seguir si SÓLO le preocupa la velocidad. Pero si le preocupa la escalabilidad o el mantenimiento, los SP pueden no ser los mejores. Nuestra arquitectura se basa en SP y después de 10 años de código, es muy difícil de mantener y muy defectuoso. Un buen mapeador ORM podría ser una mejor opción.

+5

Good ORM es una contradicción. –

+0

El hecho de que los SP no funcionen para usted no significa que no funcione. Los SP se pueden hacer bien, los ORM se pueden hacer incorrectamente –

16

Diría que los SP no se pueden mantener y no se escalan. Pregunte a cualquier desarrollador que haya tenido que agregar funcionalidad a un sistema SP pesado. ¿Por qué tienes la mitad de tu lógica en una capa diferente? No hay nada para reemplazar, simplemente no los use.

Googled this great post.

+1

¿cómo justificas esa primera oración? Yo diría que cualquier código puede escalar y ser mantenible tanto como cualquier otro código en gran medida – mjallday

+0

Mi experiencia. Quizás debería decir: "Para mí, los SP son difíciles de mantener, especialmente a escala, con muchos desarrolladores en diferentes continentes". Si todo el sistema es SP, eso es una cosa. No he visto ningún sistema así. –

+1

No estoy seguro de que la publicación haya sido tan buena. Ese tipo también se oponía a usar restricciones de base de datos (como claves externas). Creo que también se opuso a usar la clave principal o restricciones únicas en el nivel de la base de datos. Me parece completamente loco. – RussellH

3

ORM y LINQ a SQL parecen ser las tendencias actuales para reemplazar StoredProcs.

Yo personalmente he usado ORM y me resulta mucho más fácil de mantener y de dar soporte.

Algunas de las razones indicadas para usar procesos almacenados donde nunca son razones legítimas para empezar.

Hace un buen punto acerca de tener un procedimiento almacenado cuando da servicio a varias aplicaciones; se convierten esencialmente en DAL, generalmente con cierta lógica de negocios allí.

+0

Mira, son cosas como esta las que realmente me confunden .. Revisa el resumen. http://www.theserverside.net/news/thread.tss?thread_id=31953 – Skittles

+0

Pero hasta que ORM y LINQ sean compatibles con todos los idiomas, seguiremos usando SP (aunque desearía que LINQ se extendiera más rápido). –

+0

Este artículo Serverside pierde el sentido (una vez más) como tantos otros. Las personas que argumentan en contra de los procesos almacenados (para la mayoría pero no en todas las situaciones) no están abogando por mover sql de los procesos almacenados a un DAL. ¡Están abogando por eliminar el sql todos juntos! ¿Cómo puede eso no ser más sostenible? – Craig

43

tal vez soy demasiado viejo o demasiado flojo, o ambos, pero no estoy de acuerdo. Una y otra vez, los procedimientos almacenados han 'guardado el día' porque cuando aparece un error menor en el componente , solo tenemos que arreglar el procedimiento almacenado en lugar de actualizar la aplicación de escritorio en varias docenas de escritorios más el servidor web. Además, los usuarios no son interrumpidos. Esto ahorra una gran cantidad de esfuerzo y molestias al usuario.

Además, algunas operaciones DB serán más eficientes en el servidor en lugar de ir y venir a través de la red, especialmente. cuando un procedimiento almacenado llama a otro que llama a otro, etc. (con o sin cursores)

EDITAR: en una arquitectura SOA, la cuestión de la actualización del cliente-aplicaciones se mitiga (gracias maud-dib), pero los procedimientos almacenados llaman a cada otro es aún más eficiente que múltiples viajes redondos a la capa SOA.Y la actualización de la capa SOA tampoco siempre es trivial.

+1

Acepto, esto sigue siendo muy cierto para cualquier tipo de aplicación distribuida. Siento que no es tan importante como lo fue para las aplicaciones centradas en el servidor, ya que una DLL recompilada se cayó en una aplicación el servidor realiza la misma función. – cfeduke

+3

Que las aplicaciones no se deben conectar a la base de datos. Se deberían conectar a una capa de servicio. – flukus

+1

LOL - iw Debería estar de acuerdo, excepto que (a) algunas de estas aplicaciones son más antiguas que SOA, (b) algunas de estas aplicaciones son en tiempo real, (c) SOA solo mueve el problema, ya que la afirmación original era que los procedimientos almacenados son "obsoletos" –

1

También depende de lo que estén haciendo los procedimientos almacenados.

Por ejemplo si es sólo

select a from b where x = y 

a continuación un procedimiento almacenado es algo excesivo. Pero yo personalmente tiendo a usar procs almacenados para devolver múltiples conjuntos de resultados y resultados de página dentro de la base de datos.

En mi caso, puedo ver un beneficio de su uso. Es una capa extra para tratar, pero si tienes tu código bien organizado y lógico, no veo demasiada molestia personalmente.

Un buen proyecto con procedimientos almacenados siempre va a ser mejor que un proyecto de mala calidad sin y viceversa.

1

Solo lanzando mi pequeño consejo aquí. Antes de SQL 2005 (tal vez incluso más que eso), SP era más rápido. Sin embargo, SQL Server 2005 y versiones posteriores están realmente optimizados y guardan sus consultas sobre la marcha. De hecho, tuvimos una aplicación web transferida a un nuevo servidor SQL. La aplicación comenzó a funcionar ralentizando para todos. Todo estaba tomando "3/4 de segundo" o 1 segundo para correr. Entonces SQL comenzó a compilar la consulta más utilizada y todo pasó de lento a rápido.

Por supuesto, intercambiamos el servidor mientras había mucha gente corriendo (lo que puede explicar por qué fue lento al principio). Pero confía en mí SP no ha terminado. Simplemente tienen otros usos que estar vinculados a una aplicación.

+1

Desde SQL Server 7 las consultas se han almacenado en caché. – Craig

2

Cuando combina SP con lógica con la base de datos en sí, convierte efectivamente la base de datos en algo parecido a un servidor de aplicaciones.

Cuando este era el martillo más útil, tenía mucho sentido. Pero ahora, con la disponibilidad ubicua de Servidores de aplicaciones, tiene más sentido aprovecharlos para cosas como la lógica centralizada y las reglas de negocio y confiar en la base de datos solo para la persistencia.

2

A juzgar por el desempeño deslucido de este sitio, voy a apostar que el mayor cuello de botella es la base de datos.

No estoy convencido de ninguna manera de que el LINQ 2 SQL ORM que están utilizando sea un poco más rápido que un sproc.

1

Los SP se usan generalmente demasiado pronto en el proceso de desarrollo. Deben usarse cuando tenga una declaración sql de cuello de botella. Por ejemplo, probablemente no necesite un SP para eliminar o crear usuarios para una aplicación. Para la mayoría de empresas que deberían ser bastante estáticas.

+0

Exactamente. Los SP no son algo maligno que nunca deba crearse (muchos usuarios que no usan ORM parecen tener la impresión de que creemos esto). Una consulta súper compleja que es un cuello de botella común en el la aplicación es un gran uso para los procesos almacenados – flukus

+0

si con 'consulta' quieres decir 'un conjunto de enunciados T-SQL', entonces debo estar de acuerdo. Pero si literalmente quieres decir 'consulta', es decir, un SELECTO individual, entonces debo estar en desacuerdo. un ejemplo simple/tonto, eliminar a un usuario de una aplicación puede convertirse en una cascada para eliminar cada registro que el usuario haya creado, en varias tablas ... –

+0

¿Por qué no se debe usar para eliminar a un usuario? Hay muchas consultas que debe ejecutarse para eliminar un usuario (rompiendo FK, eliminando objetos dependientes cuando corresponda). Escribo el SQL una vez y luego lo pego en un SP. Ahora es una rutina enlatada. Mi "capa de negocios" puede llamar eso, o copiar/pegar. –

9

Sigo escuchando el argumento de que los SP son buenos si tiene múltiples aplicaciones conectadas a la base de datos o que facilita la corrección de errores.

¡ESTO ES PARA QUÉ ES LA CAPA DE SERVICIO!

La lógica empresarial va en la capa de servicio, la lógica de la aplicación va en la aplicación/sitio web.

Es mucho más difícil depurar y mantener cientos de SP (especialmente si se generan) que mantener un código bien escrito que se comunica con un DB a través de una herramienta ORM.

+4

me gustan las herramientas ORM, aceleran el desarrollo, pero no sustituyen las actualizaciones complejas. Probablemente encontrará, a través de la creación de perfiles, que reemplazar las actualizaciones pesadas de ORM con un sproc mejorará considerablemente el rendimiento. Suponiendo que sus operaciones de DB son tan complejas, por supuesto ... –

+0

Estoy de acuerdo, si encuentra un cuello de botella y un SP lo resuelve, ese sería un caso de uso válido. – flukus

+0

+1 para recordarnos el uso de capas de servicio, y para estar de acuerdo ;-) –

7

Maintabilidad Probablemente los SP sean mejores. Si mantener cientos de SP es difícil, es aún más difícil mantenerlos en los componentes del nivel empresarial.

Rendimiento El almacenamiento en caché de las consultas puede estar produciendo un rendimiento cercano al SP. Pero no pueden igualar el rendimiento de los SP en distintas variedades de bases de datos en variedades de plataforma. La latencia de la red es otra área de preocupación, aunque la brecha se está reduciendo en la actualidad.

Debug Probablemente sea bastante fácil con los SP que depurando el nivel de negocio + nivel de db juntos.

Puede haber incluso más puntos con los SP.

Pero al observar la tendencia moderna de la programación, es más bien "sabio" ir con la arquitectura 'N' por muchas razones comerciales que seguir con el enfoque "antiguo" basado en SP.

Un buen sistema debería tener una combinación de ambos. Probablemente siguiendo el principio 80-20, siendo 20 SP.

1

¿Podría ser más bien que Jeff Atwood sabe procedimientos almacenados estarán por siempre y simplemente estaba tratando de estimular el pensamiento y el debate? Me gusta pensar que lo que realmente le gustaría hacer es escribir un ensayo persuasivo titulado "Procedimientos almacenados considerados dañinos" :)

2

Algunos puntos buenos hacen en ambos lados (por así decirlo) pero nadie ha hecho mucho de la implicación de seguridad. Al agrupar toda la interacción DB en SP, significa que puede bloquear la base de datos para que cualquier interacción con los datos pueda controlarse estrechamente.

Si piensa en la encapsulación, puede considerar la base de datos como un objeto y los SP como métodos y propiedades que exponen la funcionalidad de los objetos al mundo exterior.

En algunos entornos de desarrollo más grandes, los desarrolladores de la capa de negocios y UI no están permitidos cerca de la base de datos. Especifican sus requisitos y el equipo separado proporciona una interfaz a través de SP.

Existen algunas buenas razones para no usar los SP y algunas buenas razones para usarlos solo dependen de su aplicación y su entorno. Pero tenga la seguridad de que los SP no irán a ningún lado pronto.

1

Podría agregar que algo de trabajo se hace mejor en el nivel de base de datos.
p. Resultados de la tabla cruzada en SQL 2005, consultas recursivas.

Acepto que algunas de las cosas simples como SELECT, INSERT, UPDATE, DELETE pueden ser atendidas por ORM, Linq.

Por lo tanto, es estúpido decir que los días de procedimientos almacenados han terminado.
¿Cuántas personas realmente tienen que preocuparse por los cambios de la plataforma DB (SQL a Mysql, Oracle)?

+0

+1 para tabla cruzada !!! –

1

Parte de esto se debe a la disponibilidad de almacenes de datos no relacionales. Los SP generalmente implican una base de datos relacional; ORM y Linq ofrecen la capacidad de crear capas de abstracción que son más ricas que las ofertas de SQL, y a veces una mejor coincidencia para las abstracciones que usamos en otras partes del diseño (el problema de "falta de adecuación de impedancia").)

Y también se puede considerar una función de la arquitectura. Los SP coinciden bastante bien con una aplicación clásica basada en tablas, y pueden proporcionar una forma conveniente de diseñar una capa de abstracción a nivel de objetos de negocio.

No son tan útiles si su almacén de datos es xml o una base de datos analítica.

0

Bah!

ORM, SP, Vista, Magic Wands, o lo que sea.

Cada "herramienta" tiene su lugar en su cinturón, utilice las herramientas que tenga con prudencia.

Lo único que ha "cambiado" (realmente mejorado) es que algunos ORM tienen buenas herramientas de almacenamiento en caché y MySql y Sql 2005+ pueden manejar el almacenamiento en caché dinámico o ad hoc.

La posible pérdida de rendimiento al arrojar todo tipo de sql dinámico en su servidor de db se ha mitigado un tanto. Simplemente es más fácil ir sin procedimientos almacenados ahora. Los Provisos almacenados no van a ir a ningún lado.

1

Procedimientos almacenados/Vistas/Las funciones siguen siendo una buena "interfaz" para la base de datos si está ejecutando varias aplicaciones empresariales que comparten la misma base de datos.

Aplicación n. ° 1: debe agregar una nueva relación/campo, o cambiar una columna que admite nulos por nula.

Aplicación # 2-10 - puede o no puede utilizar este objeto de base de datos

La primera cosa que quiero hacer es comprobar mis dependencias de objetos de base de datos para determinar cómo la utiliza y si voy a romper nada. Bueno, adivina qué, si tienes un montón de consultas externas VIA ORM/SQL no tendrías ni idea de las dependencias.

Este es el único inconveniente que encontré al tener acceso directo a las tablas.

Para una sola aplicación que utiliza una única base de datos, esto realmente no es un problema. Aunque todavía tiene que mirar el código de la aplicación para las dependencias además de la base de datos.

3

Los objetos almacenados son útiles para cosas que son no CRUD - como la lógica especializada de tabla cruzada que se ejecuta mejor en la base de datos. Las operaciones CRUD no deberían usar SP a menos que sean la salida generada automáticamente de una herramienta ORM como TableAdapters.

Cuestiones relacionadas