【问题标题】:SQL Server CTE Error in Group By分组依据中的 SQL Server CTE 错误
【发布时间】:2016-08-09 18:05:50
【问题描述】:

我的存储过程很慢(并且缺少新数据),我需要让它更快,所以这次我使用了 CTE(第一次使用)。

原来的

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;

而新的是:

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

问题是新的现在慢了四倍,结果不像上一个那样在一个组中,但是我在“tblChegada”中使用了group by。

我也是加上执行时间的两张图片

【问题讨论】:

  • 您的问题到底是什么?是关于执行时间还是分组?
  • CTE 是语法的便利,或者它们提供了新的功能(递归 CTE)。它们不应该对性能产生影响,但是在 SQL Server 中。
  • 两者,但我真的很想知道它为什么不能正确分组,这是更大的问题,我将继续尝试通过小改动来改进执行时间。
  • 设置Bad Habits to kick - putting NOLOCK everywhere - 不建议在任何地方使用它 - 恰恰相反!
  • 我认为 CTE 不会让事情变得更快,它可能会让事情变得更慢。查看 SQL Management Studio 中的查询计划,了解如何从那里改进查询。

标签: sql sql-server tsql group-by common-table-expression


【解决方案1】:

我认为,tblChegadas 返回 3 条记录,但 tblRegionais 返回超过 3 条记录(DISTINCT 包括 COR_FILIAL.COD_Regional)。

在您执行GROUP BY [R].COD_Regional 之后,您在tblSaida 中执行了INNER JOIN,因此tblSaida 返回的记录多于3,因为tblRegionais 返回的记录多于3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2011-06-09
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多