22

He estado leyendo mucho sobre los planes de ejecución y los problemas de los parámetros dinámicos en los procedimientos almacenados. Conozco las soluciones sugeridas para esto.Servidor SQL: funciones con valores de tabla frente a procedimientos almacenados

Mi pregunta, sin embargo, es que todo lo que he leído indica que SQL Server almacena en caché el plan de ejecución para los procedimientos almacenados. No se menciona las funciones de valor de tabla. Supongo que lo hace para Views (sin interés).

¿Se vuelve a compilar cada vez que se llama a una función de valor de tabla?

¿Cuándo es mejor utilizar una función de valor de tabla en lugar de un procedimiento almacenado?

+0

posible duplicado de [Funciones frente a procedimientos almacenados] (http://stackoverflow.com/questions/178128/functions-vs-stored-procedures) –

+0

Esta pregunta fue hecha y respondida hace 3 años. ¿Cuál es el propósito de cerrarlo saber incluso si se trata de un duplicado como se alega? – IamIC

Respuesta

25

Una función de tabla en línea (TVF) es como una macro: se ha expandido a la consulta externa. No tiene un plan como tal: la llamada SQL tiene un plan.

Un multi-statement TVF tiene un plan (encontrará una referencia).

Los TVF son útiles cuando desea variar la lista de SELECCIÓN para una entrada con parámetros. Los TVF en línea se expanden y el optimizador seleccionará/seleccionará el exterior. Para la optimización de TVF de varias sentencias no es realmente posible porque debe ejecutarse hasta su finalización, y luego filtro.

Personalmente, utilizaría un proceso almacenado en un TVF de varias instrucciones. Son más flexibles (por ejemplo, sugerencias, pueden cambiar de estado, CONFIGURAR NOCOUNT ON, SET XACTABORT, etc.).

No tengo ninguna objeción a los TVF en línea, pero no los uso para el código del cliente debido a la imposibilidad de usar SET y cambiar el estado.

+0

Wow, entonces la conclusión es que solo se almacenan los planes de ejecución de caché de procedimientos y, por lo tanto, es el método más eficiente para consultar datos, superando incluso a las vistas. – IamIC

+1

@IanC: ve también caché (como TVF en línea). Los procesos almacenados son mucho más flexibles (por ejemplo, si quiero SET NOCOUNT ON, SET XACTABORT + TRY/CATCH) – gbn

+0

Estoy utilizando multi-statement TVFs para entrada de parámetros variados, con la "OPCIÓN \t (OPTIMIZE FOR (@JobID UNKNOWN. ...)) inclusión. ¿Es esto óptimo? – IamIC

0

No he verificado esto, pero doy por hecho que el plan de ejecución para las funciones también se almacena en caché. No puedo ver una razón por la que eso no sería posible.

Sin embargo, el plan de ejecución para las vistas no está en la memoria caché. La consulta en la vista formará parte de la consulta que utiliza la vista, por lo que el plan de ejecución se puede almacenar en caché para la consulta que usa la vista, pero no para la vista en sí.

El uso de funciones en comparación con el procedimiento almacenado depende del resultado que necesite de él. Una función con valores de tabla puede devolver un único resultado, mientras que un procedimiento almacenado puede devolver un resultado, muchos resultados o ningún resultado.

+0

Una cosa que noté es que no puedo agregar "OPTIMIZAR POR DESCONOCIDO" a las funciones, lo que me hace pensar que es nulo e inválido. – IamIC

Cuestiones relacionadas