SQL Server:使用变量时select-statement的性能问题

时间:2014-01-08 15:43:39

标签: sql-server variables database-performance

我对有和没有变量的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。

非常感谢你的帮助......

0 个答案:

没有答案