Dlaczego funkcje wycenione według skali Scalara wydają się powodować, że zapytania będą kumulatywnie wolniejsze, im więcej razy z rzędu, że są używane?Dlaczego funkcje SQL Server Scalar są wolniejsze?
Mam tę tabelę, która została zbudowana na podstawie danych zakupionych od firmy zewnętrznej.
Usunąłem kilka rzeczy, aby ten post był krótszy ... ale tylko po to, aby zorientować się, jak wszystko jest skonfigurowane.
CREATE TABLE [dbo].[GIS_Location](
[ID] [int] IDENTITY(1,1) NOT NULL, --PK
[Lat] [int] NOT NULL,
[Lon] [int] NOT NULL,
[Postal_Code] [varchar](7) NOT NULL,
[State] [char](2) NOT NULL,
[City] [varchar](30) NOT NULL,
[Country] [char](3) NOT NULL,
CREATE TABLE [dbo].[Address_Location](
[ID] [int] IDENTITY(1,1) NOT NULL, --PK
[Address_Type_ID] [int] NULL,
[Location] [varchar](100) NOT NULL,
[State] [char](2) NOT NULL,
[City] [varchar](30) NOT NULL,
[Postal_Code] [varchar](10) NOT NULL,
[Postal_Extension] [varchar](10) NULL,
[Country_Code] [varchar](10) NULL,
Następnie mam dwie funkcje, które wyglądają LAT i LON.
CREATE FUNCTION [dbo].[usf_GIS_GET_LAT]
(
@City VARCHAR(30),
@State CHAR(2)
)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @LAT INT
SET @LAT = (SELECT TOP 1 LAT FROM GIS_Location WITH(NOLOCK) WHERE [State] = @State AND [City] = @City)
RETURN @LAT
END
CREATE FUNCTION [dbo].[usf_GIS_GET_LON]
(
@City VARCHAR(30),
@State CHAR(2)
)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @LON INT
SET @LON = (SELECT TOP 1 LON FROM GIS_Location WITH(NOLOCK) WHERE [State] = @State AND [City] = @City)
RETURN @LON
END
Gdy uruchomię następujących ...
SET STATISTICS TIME ON
SELECT
dbo.usf_GIS_GET_LAT(City,[State]) AS Lat,
dbo.usf_GIS_GET_LON(City,[State]) AS Lon
FROM
Address_Location WITH(NOLOCK)
WHERE
ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)
SET STATISTICS TIME OFF
100 ~ = 8 ms, 200 ~ = 32 ms, 400 ~ = 876 ms
--edit Niestety powinienem były bardziej wyraźne. Nie chcę dostroić powyższego zapytania. To tylko próbka, która pokazuje, że czas wykonywania jest coraz wolniejszy, im więcej rekordów przechwytuje. W aplikacji świata rzeczywistego funkcje są używane jako część klauzuli where do budowania promienia wokół miasta i stanu w celu uwzględnienia wszystkich rekordów w tym regionie.
Niech nie posypać podpowiedzi nolock na próbkach, które nie potrzebują go w SO, rzeczy NOLOCK naprawdę nie mają nic wspólnego z tym pytaniem. –
, jeśli nie możesz pozbyć się funkcji w "prawdziwym zapytaniu", to zawsze będzie naprawdę wolno. Daj lepszy przykład, używając funkcji w WHERE i możemy dać ci pomysły na ten temat ... –