2011-01-26 14 views
15

Tengo una consulta sql que voy a reutilizar en varios procedimientos almacenados. La consulta funciona en varias tablas y devuelve un valor entero basado en 2 variables que se le pasan.reutilizar sql con vista o función

En lugar de repetir la consulta en diferentes procedimientos almacenados quiero compartirlo y tienen 2 opciones:

  1. crear una vista a la que me pueda unir a partir de las variables y obtener el valor entero de ella.
  2. crear una función de nuevo con los criterios que se le pasan y vuelven variables

estoy inclinando hacia la opción 1, pero le gustaría comentarios sobre lo que es mejor y más práctica común entero. ¿Qué sería mejor rendimiento sabia etc. (unirse a una vista o función que llama)

EDIT: El RDBMS es SQL Server

Respuesta

13

Si siempre utilizará el mismo predicado parametrizado para filtrar los resultados, entonces elegiría una función parametrizada en la tabla en línea. En teoría, esto se trata de la misma manera que una Vista, ya que ambos se expanden con el optimizador, en la práctica puede evitar problemas de empuje de predicados. Un ejemplo de tal caso se puede ver en la segunda parte de this article.

Como Andomar señala en los comentarios la mayor parte del tiempo, el optimizador de consultas hace un buen trabajo al presionar el predicado hacia donde se necesita, pero no conozco ninguna circunstancia en la que el TVF en línea funcione peor, así que parece una elección racional por defecto entre los dos constructos (muy similares).

La única ventaja que puedo ver para la vista es que le permite seleccionar sin un filtro o con diferentes filtros, por lo que es más versátil.

Los TVF en línea también se pueden usar para reemplazar las UDF escalares por ganancias de eficiencia as in this example.

1

No se puede pasar variables en un punto de vista, por lo que su única opción parece es utilizar una función. Hay dos opciones para esto:

  • un escalar función
  • una función con valores de tabla (en línea o instrucción múltiple)

Si volvías registros, a continuación, se puede utilizar una cláusula WHERE desde fuera de una VISTA no demasiado compleja que puede entrar dentro de la consulta dentro de la vista, pero como todo lo que devuelve es una sola columna integer value, entonces una vista no funcionará.

El optimizador de consultas puede ampliar un TVF en línea para que funcione junto con la consulta externa (llamada), por lo que puede ser más rápido en la mayoría de los casos en comparación con una función SCALAR.

Sin embargo, los usos son diferentes - una función escalar devuelve un solo valor inmediatamente

select dbo.scalarme(col1, col2), other from .. 

mientras que una línea-TVF requiere que sea subconsulta o CRUZ aplicar frente a otra mesa

select (select value from dbo.tvf(col1, col2)), other from .. 

-- or 

select f.value, t.other 
from tbl t 
CROSS apply dbo.tvf(col1, col2) f -- or outer apply 
+0

Una vista puede devolver un resultado de fila única de una sola columna. Es cierto que no es un caso habitual, pero probablemente sea más eficiente que las UDF escalares. Editar - Ah, sí, estabas cuestionando el aspecto de parametrización. Supuse que sería a través de un predicado en la vista. –

+0

Puedo unirme a la vista y restringir los resultados según una cláusula where – amateur

+0

Normalmente, se "transfieren" parámetros a una vista con una cláusula Where – Andomar

0

Voy a darte una respuesta a medias porque no puedo estar seguro de qué es mejor en términos de rendimiento, lo siento. Pero seguro que otras personas han recibido buenos consejos al respecto, estoy seguro.

Me atendré a su parte de la 'práctica común' de la pregunta.

Por lo tanto, una función escalar de madera me parece una solución natural en este caso. Por qué, solo quiere un valor, un valor entero que se devolverá, para eso están las funciones escalares, ¿no es así?

Pero entonces, si pudiera ver una probabilidad de que más tarde necesitaría más de un valor, podría considerar cambiar a un TVF. Por otra parte, ¿qué sucede si ya ha implementado su función escalar y la ha utilizado en muchos lugares de su aplicación y ahora necesita una fila, una columna o una tabla de valores para devolver utilizando básicamente la misma lógica?

En mi opinión (sin juego de palabras), una vista podría convertirse en algo así como el divisor común más grande para las funciones escalares y con valores de tabla. Las funciones solo necesitarían aplicar los parámetros.

Ahora ha dicho que solo planea elegir qué opción usar. Sin embargo, teniendo en cuenta lo anterior, sigo creyendo que las vistas pueden ser una buena opción y resultarán útiles al escalar su aplicación, y podría usar ambas vistas y funciones (si eso no alterara demasiado el rendimiento) del mismo modo que descrito.

0

Una de las ventajas que tiene TVF sobre una vista es que puede forzar a quien lo llame a apuntar a un índice específico.

Cuestiones relacionadas