sql server - una - ¿Diferencia entre las funciones escalares, con valores de tabla y agregadas en el servidor SQL?
tipos de funciones en sql server (3)
¿Cuál es la diferencia entre las funciones de valor escalar, de valor de tabla y agregado en el servidor SQL? ¿Y los llama desde una consulta necesitan un método diferente, o los llamamos de la misma manera?
Funciones escalares
Las funciones escalares (a veces denominadas Funciones definidas por el usuario / UDF) devuelven un único valor como valor devuelto, no como un conjunto de resultados, y se pueden usar en la mayoría de los lugares dentro de una consulta o declaración SET
, excepto para la cláusula FROM
(y tal vez otros lugares?). Además, las funciones escalares se pueden llamar a través de EXEC
, al igual que los Procedimientos almacenados, aunque no hay muchas ocasiones para hacer uso de esta capacidad (para obtener más detalles sobre esta capacidad, consulte mi respuesta a la siguiente pregunta en DBA.StackExchange: Why escalar funciones valiosas necesitan permiso de ejecución en lugar de seleccionar? ). Estos se pueden crear tanto en T-SQL como en SQLCLR.
- T-SQL (UDF): estas funciones escalares suelen ser un problema de rendimiento porque generalmente se ejecutan para cada fila devuelta (o escaneada) y siempre prohíben los planes de ejecución en paralelo.
SQLCLR (UDF): estas funciones escalares también suelen ejecutarse por cada fila devuelta o escaneada, pero hay dos ventajas importantes sobre las UDF de T-SQL:
- A partir de SQL Server 2012, los valores de retorno se pueden plegar constantemente en el plan de ejecución SI la UDF no realiza ningún acceso a los datos, y si está marcado como
IsDeterministic = true
. En este caso, la función no se ejecutaría por cada fila. - Las funciones escalares SQLCLR pueden funcionar en planes paralelos (😃) si no tienen acceso a la base de datos.
- A partir de SQL Server 2012, los valores de retorno se pueden plegar constantemente en el plan de ejecución SI la UDF no realiza ningún acceso a los datos, y si está marcado como
Funciones con valores de tabla
Las funciones con valores de tabla (TVF) devuelven conjuntos de resultados y se pueden usar en una cláusula FROM
, JOIN
o CROSS APPLY
/ OUTER APPLY
de cualquier consulta, pero a diferencia de las simples Views, no pueden ser el objetivo de ninguna declaración DML ( INSERT
/ UPDATE
/ DELETE
). Estos también se pueden crear tanto en T-SQL como en SQLCLR.
T-SQL MultiStatement (TVF): estos TVF, como su nombre lo indica, pueden tener varias declaraciones, similares a un procedimiento almacenado. Los resultados que vayan a devolver se almacenan en una Variable de tabla y se devuelven al final; Es decir, no se devuelve nada hasta que la función haya terminado de procesarse. El número estimado de filas que devolverán, según lo informado al Query Optimizer (que afecta el plan de ejecución) depende de la versión de SQL Server:
- Antes de SQL Server 2014: estos siempre reportan 1 (sí, solo 1) fila.
- SQL Server 2014 y 2016: estos siempre reportan 100 filas.
- A partir de SQL Server 2017: el valor predeterminado es reportar 100 filas, PERO en algunas condiciones, el recuento de filas será bastante preciso (basado en las estadísticas actuales) gracias a la nueva función de ejecución intercalada .
T-SQL Inline (iTVF): estos TVF solo pueden ser una sola declaración, y esa declaración es una consulta completa, como una vista. Y, de hecho, Inline TVFs son esencialmente una vista que acepta parámetros de entrada para usar en la consulta. Tampoco almacenan en caché su propio plan de consulta ya que su definición se coloca en la consulta en la que se utilizan (a diferencia de los otros objetos que se describen aquí), por lo tanto, se pueden optimizar mucho mejor que los otros tipos de TVF (😃). Estos TVF funcionan bastante bien y se prefieren si la lógica se puede manejar en una sola consulta.
SQLCLR (TVF): estos TVF son similares a T-SQL MultiStatement TVF en que construyen todo el conjunto de resultados en la memoria (incluso si es un archivo de intercambio / página) antes de liberarlo todo al final. El número estimado de filas que devolverán, tal como se informa al Optimizador de consultas (que afecta el plan de ejecución), es siempre de 1000 filas. Dado que un recuento fijo de filas está lejos de ser ideal, respalde mi solicitud para permitir especificar el recuento de filas: Permitir que TVF (T-SQL y SQLCLR) proporcionen estimaciones de filas definidas por el usuario para el optimizador de consultas
Transmisión SQLCLR (sTVF): estos TVF permiten código complejo C # / VB.NET al igual que los TVF SQLCLR regulares, pero son especiales en el sentido de que devuelven cada fila a la consulta de llamada a medida que se generan (😃). Este modelo permite que la consulta de llamada comience a procesar los resultados tan pronto como se envía el primero, por lo que la consulta no necesita esperar a que se complete todo el proceso de la función antes de ver los resultados. Y requiere menos memoria, ya que los resultados no se almacenan en la memoria hasta que se completa el proceso. El número estimado de filas que devolverán, según lo informado al Optimizador de consultas (que afecta el plan de ejecución) siempre es 1000 filas. Dado que un recuento fijo de filas está lejos de ser ideal, respalde mi solicitud para permitir especificar el recuento de filas: Permitir que TVF (T-SQL y SQLCLR) proporcionen estimaciones de filas definidas por el usuario para el optimizador de consultas
Funciones agregadas
Los Agregados definidos por el usuario (UDA) son agregados similares a SUM()
, COUNT()
, MIN()
, MAX()
, etc. y generalmente requieren una cláusula GROUP BY
. Estos solo se pueden crear en SQLCLR, y esa capacidad se introdujo en SQL Server 2005. Además, a partir de SQL Server 2008, los UDA se mejoraron para permitir múltiples parámetros de entrada (). Una deficiencia particular es que no hay conocimiento del ordenamiento de filas dentro del grupo, por lo que crear un total acumulado, que sería relativamente fácil si se pudiera garantizar el pedido, no es posible dentro de una Asamblea SAFE
.
Por favor, también vea:
- CREAR FUNCIÓN (documentación de MSDN)
- CREAR AGREGADO (documentación de MSDN)
- Ejemplo de función de valor de tabla CLR con transmisión por secuencias completa (STVF / TVF) (artículo que escribí)
Una función escalar devuelve un solo valor. Puede que ni siquiera esté relacionado con las tablas en su base de datos.
Una función de valor de tabla devuelve las columnas especificadas para las filas de su tabla que cumplen sus criterios de selección.
Una función de valor agregado devuelve un cálculo a lo largo de las filas de una tabla, por ejemplo, sumando valores.
Función escalar
Devuelve un solo valor. Es como escribir funciones en otros lenguajes de programación usando la sintaxis T-SQL
.
Función de tabla de valores
Es un poco diferente en comparación con lo anterior. Devuelve un valor de tabla. Dentro del cuerpo de esta función, escribe una consulta que devolverá la tabla exacta. Por ejemplo:
CREATE FUNCTION <function name>(parameter datatype)
RETURN table
AS
RETURN
(
-- *write your query here* ---
)
Tenga en cuenta que no hay ninguna BEGIN
& END
aquí.
Funciones agregadas
Incluye funciones integradas que se utilizan junto con la cláusula GROUP
. Por ejemplo: SUM()
, MAX()
, MIN()
, AVG()
, COUNT()
son funciones agregadas.