시행 착오 및 실행 계획을 사용하여 최적화하려고 지난 이틀 동안 보낸 SQL 쿼리가 있지만 아무 소용이 없습니다. 이 일을 용서해주십시오. 그러나 전체 실행 계획을 여기에 게시하겠습니다. 쿼리 및 실행 계획에서 테이블 및 열 이름을 간략하게 만들고 회사의 IP를 보호하기 위해 노력했습니다. 실행 계획은 SQL Sentry Plan Explorer 로 열 수 있습니다 .
나는 상당한 양의 T-SQL을 수행했지만 쿼리를 최적화하기 위해 실행 계획을 사용하는 것이 새로운 영역이며 실제로 수행 방법을 이해하려고 노력했습니다. 따라서 누군가 나를 도와 주고이 실행 계획을 해독하여 쿼리에서 최적화하는 방법을 찾는 방법을 설명 할 수 있다면 영원히 감사 할 것입니다. 최적화 할 쿼리가 더 많이 있습니다. 첫 번째 질문에 도움이되는 스프링 보드 만 있으면됩니다.
이것은 쿼리입니다.
DECLARE @Param0 DATETIME = '2013-07-29';
DECLARE @Param1 INT = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112))
DECLARE @Param2 VARCHAR(50) = 'ABC';
DECLARE @Param3 VARCHAR(100) = 'DEF';
DECLARE @Param4 VARCHAR(50) = 'XYZ';
DECLARE @Param5 VARCHAR(100) = NULL;
DECLARE @Param6 VARCHAR(50) = 'Text3';
SET NOCOUNT ON
DECLARE @MyTableVar TABLE
(
B_Var1_PK int,
Job_Var1 varchar(512),
Job_Var2 varchar(50)
)
INSERT INTO @MyTableVar (B_Var1_PK, Job_Var1, Job_Var2)
SELECT B_Var1_PK, Job_Var1, Job_Var2 FROM [fn_GetJobs] (@Param1, @Param2, @Param3, @Param4, @Param6);
CREATE TABLE #TempTable
(
TTVar1_PK INT PRIMARY KEY,
TTVar2_LK VARCHAR(100),
TTVar3_LK VARCHAR(50),
TTVar4_LK INT,
TTVar5 VARCHAR(20)
);
INSERT INTO #TempTable
SELECT DISTINCT
T.T1_PK,
T.T1_Var1_LK,
T.T1_Var2_LK,
MAX(T.T1_Var3_LK),
T.T1_Var4_LK
FROM
MyTable1 T
INNER JOIN feeds.MyTable2 A ON A.T2_Var1 = T.T1_Var4_LK
INNER JOIN @MyTableVar B ON B.Job_Var2 = A.T2_Var2 AND B.Job_Var1 = A.T2_Var3
GROUP BY T.T1_PK, T.T1_Var1_LK, T.T1_Var2_LK, T.T1_Var4_LK
-- This is the slow statement...
SELECT
CASE E.E_Var1_LK
WHEN 'Text1' THEN T.TTVar2_LK + '_' + F.F_Var1
WHEN 'Text2' THEN T.TTVar2_LK + '_' + F.F_Var2
WHEN 'Text3' THEN T.TTVar2_LK
END,
T.TTVar4_LK,
T.TTVar3_LK,
CASE E.E_Var1_LK
WHEN 'Text1' THEN F.F_Var1
WHEN 'Text2' THEN F.F_Var2
WHEN 'Text3' THEN T.TTVar5
END,
A.A_Var3_FK_LK,
C.C_Var1_PK,
SUM(CONVERT(DECIMAL(18,4), A.A_Var1) + CONVERT(DECIMAL(18,4), A.A_Var2))
FROM #TempTable T
INNER JOIN TableA (NOLOCK) A ON A.A_Var4_FK_LK = T.TTVar1_PK
INNER JOIN @MyTableVar B ON B.B_Var1_PK = A.Job
INNER JOIN TableC (NOLOCK) C ON C.C_Var2_PK = A.A_Var5_FK_LK
INNER JOIN TableD (NOLOCK) D ON D.D_Var1_PK = A.A_Var6_FK_LK
INNER JOIN TableE (NOLOCK) E ON E.E_Var1_PK = A.A_Var7_FK_LK
LEFT OUTER JOIN feeds.TableF (NOLOCK) F ON F.F_Var1 = T.TTVar5
WHERE A.A_Var8_FK_LK = @Param1
GROUP BY
CASE E.E_Var1_LK
WHEN 'Text1' THEN T.TTVar2_LK + '_' + F.F_Var1
WHEN 'Text2' THEN T.TTVar2_LK + '_' + F.F_Var2
WHEN 'Text3' THEN T.TTVar2_LK
END,
T.TTVar4_LK,
T.TTVar3_LK,
CASE E.E_Var1_LK
WHEN 'Text1' THEN F.F_Var1
WHEN 'Text2' THEN F.F_Var2
WHEN 'Text3' THEN T.TTVar5
END,
A.A_Var3_FK_LK,
C.C_Var1_PK
IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
BEGIN
DROP TABLE #TempTable
END
IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
BEGIN
DROP TABLE #TempTable
END
내가 찾은 것은 세 번째 진술 (느린 것으로 언급 된)이 가장 많은 시간을 소비하는 부분이라는 것입니다. 이 두 문장은 거의 즉시 돌아온다.
실행 계획은 이 링크 에서 XML로 제공됩니다 .
마우스 오른쪽 버튼을 클릭하고 저장 한 다음 브라우저에서 열지 않고 SQL Sentry Plan Explorer 또는 다른보기 소프트웨어에서 여는 것이 좋습니다.
테이블이나 데이터에 대한 정보가 더 필요하면 언제든지 문의하십시오.
tempdb
. (가) 간의 조인의 결과 행에 대한 평가, 즉 TableA
및 @MyTableVar
해제 방법을됩니다. 또한 정렬에 들어가는 행 수는 예상보다 훨씬 많아서 유출 될 수 있습니다.