我对有和没有变量的SELECT语句的性能有疑问。以下语句在大约3秒内运行:
SELECT TOP 10 CAST(a.PLZ05 AS NVARCHAR(7)) AS Postleitzahl,
SUM(a.ANZ) AS Anzahl,
a.[HER] AS HSN,
a.HERTX AS Hersteller,
a.TYP AS TSN,
CASE
WHEN b.[Fabrikmarke] IS NULL THEN 'k.A.'
ELSE b.[Fabrikmarke]
END AS Fabrikmarke,
CASE
WHEN b.[Handelsname] IS NULL THEN 'k.A.'
ELSE b.[Handelsname]
END AS Handelsname,
CASE
WHEN AVG(b.[Nennleistung_KW]) IS NULL THEN 'k.A.'
ELSE CAST(AVG(b.[Nennleistung_KW]) AS NVARCHAR(10))
END AS Nennleistung_KW,
CASE
WHEN AVG(b.[Nennleistung_PS]) IS NULL THEN 'k.A.'
ELSE CAST(AVG(b.[Nennleistung_PS]) AS NVARCHAR(10))
END AS Nennleistung_PS,
CASE
WHEN AVG(b.[MAX_Hubraum_cm3]) IS NULL THEN 'k.A.'
ELSE CAST(AVG(b.[MAX_Hubraum_cm3]) AS NVARCHAR(10))
END AS MAX_Hubraum_cm3
FROM STAMM_KBA a
LEFT OUTER JOIN STAMM_FZG b
ON a.[HER] = b.HSN
AND a.TYP = b.TSN
LEFT OUTER JOIN STAMM_BRD_GeoDaten c
ON a.PLZ05 = c.StadtGemeinde_Plz
WHERE b.[Code_Kraftstoffart_Energiequelle] LIKE '%%'
AND [Nennleistung_KW] BETWEEN 10 AND 110
AND [Nennleistung_PS] BETWEEN 0 AND 427
AND [MAX_Hubraum_cm3] BETWEEN 100 AND 1000
AND c.Bundesland = 'Niedersachsen'
AND PLZ05 != 0
GROUP BY a.PLZ05,
a.[HER],
a.HERTX,
a.TYP,
b.[Fabrikmarke],
b.[Handelsname]
如果我使用变量,select语句的速度会急剧下降超过3分钟。这是带变量的语句:
DECLARE @kraftstoffart NVARCHAR(1)
DECLARE @kw_von INT
DECLARE @kw_bis INT
DECLARE @ps_von INT
DECLARE @ps_bis INT
DECLARE @ccm_von INT
DECLARE @ccm_bis INT
DECLARE @value1 NVARCHAR(255)
SET @kraftstoffart = ''
SET @kw_von = 10
SET @kw_bis = 110
SET @ps_von = 0
SET @ps_bis = 427
SET @ccm_von = 100
SET @ccm_bis = 1000
SET @value1 = 'Niedersachsen'
SELECT TOP 10 CAST(a.PLZ05 AS NVARCHAR(7)) AS Postleitzahl,
SUM(a.ANZ) AS Anzahl,
a.[HER] AS HSN,
a.HERTX AS Hersteller,
a.TYP AS TSN,
CASE
WHEN b.[Fabrikmarke] IS NULL THEN 'k.A.'
ELSE b.[Fabrikmarke]
END AS Fabrikmarke,
CASE
WHEN b.[Handelsname] IS NULL THEN 'k.A.'
ELSE b.[Handelsname]
END AS Handelsname,
CASE
WHEN AVG(b.[Nennleistung_KW]) IS NULL THEN 'k.A.'
ELSE CAST(AVG(b.[Nennleistung_KW]) AS NVARCHAR(10))
END AS Nennleistung_KW,
CASE
WHEN AVG(b.[Nennleistung_PS]) IS NULL THEN 'k.A.'
ELSE CAST(AVG(b.[Nennleistung_PS]) AS NVARCHAR(10))
END AS Nennleistung_PS,
CASE
WHEN AVG(b.[MAX_Hubraum_cm3]) IS NULL THEN 'k.A.'
ELSE CAST(AVG(b.[MAX_Hubraum_cm3]) AS NVARCHAR(10))
END AS MAX_Hubraum_cm3
FROM STAMM_KBA a
LEFT OUTER JOIN STAMM_FZG b
ON a.[HER] = b.HSN
AND a.TYP = b.TSN
LEFT OUTER JOIN STAMM_BRD_GeoDaten c
ON a.PLZ05 = c.StadtGemeinde_Plz
WHERE b.[Code_Kraftstoffart_Energiequelle] LIKE '%' + @kraftstoffart + '%'
AND [Nennleistung_KW] BETWEEN @kw_von AND @kw_bis
AND [Nennleistung_PS] BETWEEN @ps_von AND @ps_bis
AND [MAX_Hubraum_cm3] BETWEEN @ccm_von AND @ccm_bis
AND c.Bundesland = @value1
AND PLZ05 != 0
GROUP BY a.PLZ05,
a.[HER],
a.HERTX,
a.TYP,
b.[Fabrikmarke],
b.[Handelsname]
为什么会发生这种情况?如何才能再次提升性能?
我正在使用SQL-Server 2008 R2。
非常感谢你的帮助......