【发布时间】: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