sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué las funciones con valores escalares de SQL Server se vuelven más lentas?

En la mayoría de los casos, es mejor evitar las funciones de valores escalares que hacen referencia a las tablas porque (como dijeron otros) son básicamente cajas negras que deben ejecutarse una vez para cada fila y no pueden optimizarse con el motor del plan de consultas. Por lo tanto, tienden a escalar linealmente incluso si las tablas asociadas tienen índices.

Es posible que desee considerar el uso de una función con valores de tabla en línea, ya que se evalúan en línea con la consulta y se pueden optimizar. Obtiene la encapsulación que desea, pero el rendimiento de pegar las expresiones directamente en la declaración de selección.

Como efecto secundario de estar en línea, no pueden contener ningún código de procedimiento (no declare @variable; set @variable =..; return). Sin embargo, pueden devolver varias filas y columnas.

Podría volver a escribir sus funciones algo como esto:

create function usf_GIS_GET_LAT(
    @City varchar (30),
    @State char (2)
)
returns table
as return (
  select top 1 lat
  from GIS_Location with (nolock) 
  where [State] = @State
    and [City] = @City
);

GO

create function usf_GIS_GET_LON (
    @City varchar (30),
    @State char (2)
)
returns table
as return (
  select top 1 LON
  from GIS_Location with (nolock)
  where [State] = @State
    and [City] = @City
);

La sintaxis para usarlos también es un poco diferente:

select
    Lat.Lat,
    Lon.Lon
from
    Address_Location with (nolock)
    cross apply dbo.usf_GIS_GET_LAT(City,[State]) AS Lat
    cross apply dbo.usf_GIS_GET_LON(City,[State]) AS Lon
WHERE
    ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)