5

Estoy escribiendo informes con conjuntos de datos bastante complejos, muchas combinaciones. Para simplificar las cosas, y debido a que básicamente soy un desarrollador de OO, he estado escribiendo pequeñas funciones (generalmente escalares) para hacer el trabajo que podría hacerse al unirme a una subconsulta. Este tipo de cosas:Funciones definidas por el usuario: ¿son una mala práctica de codificación?

SELECT 
    x.Name, x.userId, 
    ... [more columns and joins] 
    dbo.CountOrders(x.userId) 
FROM Customers x 
WHERE ... 

¿Es esta una buena práctica? ¿Poco riguroso? ¿Lento? ¿Debo escribir regular T-SQL para hacer esto?

+1

Bueno, yo soy un tipo DB que ahora está haciendo un trabajo OO, whatdya decir que hacer un cambio? ¿Crees que a nuestros empleadores les importará? – tnktnk

+0

Estoy seguro de que estarás bien - La programación de OO seguramente será un día festivo en comparación con la perversidad arcaica de SQL;) – 5arx

Respuesta

3

Casi nunca tendré una UDF escalar que tenga acceso a los datos.

Las UDF escalares no pueden expandirse por el optimizador y deben evaluarse con RBAR. Está bastante bien establecido que esta no es una buena idea.

Algunos ejemplos de lectura.

+2

Vale la pena señalar que el segundo enlace aborda esta pregunta exacta y ofrece una posible alternativa ([en línea con valores de tabla UDF] (http://msdn.microsoft.com/en-us/library/ms189294.aspx)). –

+0

+1 para UDF con valores de tabla.Parece que voy a volver a escribir un montón de código T-SQL desagradable y astuto :-( Gracias por todas sus respuestas. – 5arx

+0

"Casi nunca tendría una UDF escalar que tenga acceso a datos". Me gustaría descartar "eso hace acceso a los datos". Cualquier UDF escalar en una consulta, sin importar cuán trivial sea, matará su rendimiento. –

0

En mi opinión y por mi experiencia, las funciones en línea no son necesariamente malas. A veces enfrento una tarea que no podría lograr sin usar funciones. Si reutiliza la misma rutina una y otra vez en sus procedimientos almacenados, entonces, al igual que en el viejo OOP, crea una función y la usa. Pero solo por el código limpio y corto, no recomendaría el uso de funciones, si se usa una sola vez. El rendimiento o la mejora proviene de la indexación de tablas y el mantenimiento de índices. Siempre que los índices se creen y mantengan correctamente, las funciones en línea son tan buenas como escribir una declaración SQL sencilla.

0

No creo que haya mucho daño al hacer cálculos de llamadas de función en SQL, siempre que quede claro dónde se están haciendo a los usuarios de la tabla. Todo lo que ha hecho aquí es hacer un acceso directo a una subconsulta. Sin embargo, nunca hago esto con mis consultas de acceso primarias ya que las personas comienzan a "dar por hecho" este tipo de cálculos.

Si descubro que estoy haciendo esto de manera repetitiva, me parece más valioso hacer una tabla de apartamiento que contenga este tipo de información en una forma precalculada y luego usar activadores para mantenerla actualizada. Un ejemplo de esto es una base de datos en la que acumulo los datos del resumen financiero de los artículos de línea de la factura al nivel de oferta, luego al nivel de presentación (que tiene varias cotizaciones) y luego al nivel de política (que tiene múltiples árboles de múltiples portadores).

Resulta que la mayoría de las consultas realmente necesitan los datos en el nivel de la política. Mediante el uso de desencadenantes y tablas de resumen, aceleré algunas consultas críticas literalmente en dos órdenes de magnitud simplemente porque el trabajo ya estaba hecho, al tiempo que disminuía el rendimiento de un cambio guardado en una cantidad sin importancia. Entonces, si te encuentras realizando muchas consultas de resumen, piensa en una forma de evitar el trabajo ... pero para casos simples, creo que las llamadas en línea a las funciones están bien.

Cuestiones relacionadas