2016-08-09 2 views
0

Ich hatte eine gespeicherte Prozedur, die langsam war (und neue Daten fehlte), ich muss es schneller machen, also habe ich dieses Mal ein CTE (beim ersten Mal).SQL Server CTE-Fehler in der Gruppe Von

Der alte war

Declare @Cod_Func as int; 
set @Cod_Func = 10310 

BEGIN 
    SELECT 
     D.Cod_Regional, 
     D.Nom_Regional + ' (' + CAST(COUNT(A.ID_Chegada) as varchar) + ')' as Nom_Regional 
    FROM 
     APS_CHEGADA A (NOLOCK) 
    INNER JOIN 
     APS_AcessoFilial B (NOLOCK) ON A.Cod_Regional = B.Cod_Regional 
            AND A.Cod_Filial = B.Cod_Filial 
            AND B.flg_situacao = 1 
    INNER JOIN 
     COR_Filial C (NOLOCK) ON A.Cod_Regional = C.Cod_Regional 
           AND A.Cod_Filial = C.Cod_Filial 
    INNER JOIN 
     COR_Regional D (NOLOCK) ON C.Cod_RegionalAtual = D.Cod_Regional 
    WHERE 
     A.ID_ChegadaStatus = 2 
     AND B.Cod_Func = @Cod_Func 
     AND A.FLG_SITUACAO = 1 
    GROUP BY 
     D.Cod_Regional, D.Nom_Regional 
End; 

Und der neue ist:

BEGIN 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

    WITH tblRegionais AS 
    (
     SELECT DISTINCT 
      [R].COD_Regional, 
      [F].COD_Regional AS [COD_RegionalReal], 
      [R].Nom_Regional 
     FROM 
      COR_Regional [R] WITH(NOLOCK) 
     INNER JOIN 
      COR_FILIAL [F] WITH(NOLOCK) ON [R].COD_REGIONAL = [F].COD_RegionalAtual 
     INNER JOIN 
      APS_AcessoFilial [AF] WITH(NOLOCK) ON [F].COD_Regional = [AF].COD_Regional 
               AND [F].COD_Filial = [AF].COD_Filial 
     WHERE 
      [F].FLG_SituacaoRegistro = 1 
      AND [AF].FLG_Situacao = 1 
      AND [AF].COD_Func = @COD_Func 
    ), 
    tblChegadas AS 
    ( 
     SELECT 
      [R].COD_Regional, 
      COUNT([C].ID_Chegada) AS [QTD_Chegada] 
     FROM 
      tblRegionais [R] 
     INNER JOIN 
      APS_Chegada [C] WITH(NOLOCK) ON [R].COD_RegionalReal = [C].COD_Regional 
     WHERE 
      [C].ID_ChegadaStatus = 2 
     GROUP BY 
      [R].COD_Regional 
    ), 
    tblSaida AS 
    (
     SELECT 
      [R].COD_Regional, 
      RTRIM([R].Nom_Regional) + ' (' + CAST([C].QTD_Chegada AS VARCHAR(30)) + ')' AS [NOM_Regional] 
     FROM 
      tblRegionais [R] 
     INNER JOIN 
      tblChegadas [C] ON [R].COD_Regional = [C].COD_Regional 
    ) 
    SELECT 
     [S].COD_Regional, 
     [S].NOM_Regional 
    FROM 
     tblSaida [S];  
END 

Das Problem ist die neue viermal jetzt langsamer ist, und das Ergebnis ist nicht in einer Gruppe wie die Letzter, aber ich benutze die Gruppe von "tblChegada".

Ich füge auch die beiden Bilder mit der Zeit der Ausführung

NEW ONE - VERY SLOW

OLD ONE

+3

Was ist Ihre Frage genau? Es ist in Bezug auf die Ausführungszeit oder die Gruppierung? – dfundako

+1

CTEs sind eine bequeme Syntax oder bieten neue Funktionen (rekursive CTEs). Sie sollten jedoch keinen Einfluss auf die Leistung in SQL Server haben. –

+0

Beide, aber die, die ich wirklich wissen will, warum es nicht richtig gruppiert, das ist das größere Problem, die Ausführungszeit werde ich weiterhin versuchen, mit kleinen Änderungen zu verbessern. –

Antwort

-1

Ich denke, dass tblChegadas kehrt 3 Datensätze aber tblRegionais gibt mehr als 3 Datensätze (DISTINCT umfasst COR_FILIAL.COD_Regional).

Nachdem Sie GROUP BY [R].COD_Regional tat, hast du INNER JOIN in tblSaida, so tblSaida kehrt mehr Datensätze als 3, weil tblRegionais gibt mehr als 3 Datensätze.