2009-01-19 21 views
12

¿Es la reutilización de código y modulatiry una buena idea para la programación de procedimientos almacenados de SQL?Reutilización de código y modularidad en SQL

Y, en caso afirmativo, ¿cuál es la mejor manera de agregar estas características a una base de código de procedimiento almacenado de SQL?

Normalmente creo funciones con valores escalares para tareas que son comunes y repetidas. Encuentro que facilita el desarrollo de nuevos procedimientos similares a los existentes, pero también ayuda mucho en el seguimiento de fallas y la solución de problemas.

Intento alejarme de las funciones con valores de tabla, debido a problemas de rendimiento.

Mi regla de oro es que si se trata de un cálculo, y se usa en varios lugares, entonces creo una función con valores escalares.

Respuesta

2

Sql no le da mucha flexibilidad en lo que respecta a la reutilización de código. Normalmente creo funciones cuando se trata de cálculos u otras tareas que no implican modificar tablas. Pero todas las tareas que implican escribir en tablas y ese tipo de cosas usualmente utilizo un procedimiento almacenado para obtener un mejor control de las transacciones.

0

Otra forma de verlo desde el lado de las aplicaciones es utilizar el enlace para reutilizar las consultas SQL. Pero eso probablemente no sea lo que buscas

1

Puedes dividir el código en procedimientos almacenados separados para ayudar a descomponer los complejos procesos almacenados en fragmentos más manejables. También puede hacer lo mismo para dividir la lógica común que no funcionará en una función. Piense que es similar a una refactorización del Método Extract.

+0

El problema de dividir una sp grande en varias más pequeñas, es que se pueden anidar en un solo nivel. – jandersson

+0

No estoy seguro de entender. ¿Por qué solo un nivel? – Ian1971

+0

No sé por qué, es un límite de SQL Server. No se puede ejecutar en una tabla temporal, si el procedimiento que se llama a sí mismo llama a otro procedimiento para los datos. – jandersson

5

Descubrirá que el uso de funciones dentro de sus consultas es un desastre para el rendimiento. Las funciones se convierten en una caja negra para el optimizador, por lo que terminará re-codificando la llamada de función en la consulta para que se ejecute rápidamente una vez que obtiene una gran cantidad de filas en sus tablas.

Una mejor forma de lidiar con cálculos comunes es insertarlos en una nueva columna con un desencadenador, o en sus consultas de inserción/actualización. De esta forma, puede indexar el valor calculado y usarlo directamente en lugar de calcularlo cada vez que lo necesite.

0

Para dar seguimiento a esto, me encontré con algunos problemas de rendimiento, y parece que el optimizador no puede seleccionar el índice correcto para el código dentro de las funciones.

Así que tuve que especificar el índice correcto usando sugerencias de índice (con palabra clave), para resolver el problema de rendimiento.

Cuestiones relacionadas