2014-06-20 4 views
-4

느린 실행 쿼리에 문제가 있습니다. SQL Server 프로파일 러를 사용하여 쿼리를 분석했지만 좋은 솔루션을 찾지 못하는 것 같습니다. 느리게 실행되는 이유를 찾았습니다. 전체 데이터 집합을 묻는다면 10 초에 150 행을 반환합니다. 합계와 계산을 추가하면 18 행을 반환하지만 8 분이 걸립니다.느린 실행중인 TSQL 쿼리를 해결하는 방법

SQL 서버 프로파일 러에서 전체 데이터 세트가 약 1 000 000 개의 읽기와 약 82 000 000의 합계 쿼리를 수행한다는 것을 알았습니다. 그러나 어떻게 또는 왜 많은 레코드를 얻었는지 알 수 없습니다. 전체 데이터 집합이 합계 쿼리의 하위 선택이기 때문입니다.

아래 쿼리는 예를 들어하지 실제 쿼리 (실제 쿼리는 노동 조합 하위 쿼리의 모든의를 가지고 있지만 합계 쿼리는 기본적으로 동일)입니다

SELECT Sum(x) * 0.1, 
     Sum(y), 
     a 
FROM (SELECT x, 
       y 
     FROM tx 
     INNER JOIN ty ON tx.a = ty.a 
     WHERE x = 1 --this returns 150 rows in 10s 
     ) sub 
GROUP BY a -- sum returns 18row 8min 

누군가가 좀 더 테스트 나는 나를 도와 드릴까요 해야합니까 아니면 해결책을 테스트 할 수 있습니까? First Piece execute plan Second Piece Third Piece

+0

귀하의 질의 계획 보여주기. –

+0

'SQL 서버 관리 스튜디오 (SQL Server Management Studio) '와'include Execution plans taken'에서 이들 쿼리를 모두 캡슐화하고 포함시켜야합니다. 귀하의 질문 – DrCopyPaste

+0

쿼리가 작동하는지 확인하십시오 - 하위 쿼리에 열이 없습니다. 하위 쿼리를 사용하는 이유는 무엇입니까? – MikkaRin

답변

0

하위 쿼리를 제거하기 위해 임시 테이블을 사용하여 2 단계에 쿼리를 분해하십시오 :

-- populate temp table 
SELECT x, y, a 
INTO #TEMP 
FROM tx INNER JOIN ty ON tx.a = ty.a 
WHERE x = 1 

-- query the temp table 
SELECT Sum(x) * 0.1, 
     Sum(y), 
     a 
FROM #TEMP 
GROUP BY a 
0

내가 두 번 집계를하고 건의 할 것입니다. 귀하의 예제에서이 조금 비 sensical 보이지만 구조는 다음과 같습니다

SELECT sum(x), sum(y) 
     Sum(y), 
     a 
FROM (SELECT a, sum(x) * 0.1 as x, sum(y) as y 
     FROM tx INNER JOIN 
      ty 
      ON tx.a = ty.a 
     WHERE x = 1 --this returns 150 rows in 10s 
     GROUP BY a 
     ) sub 
GROUP BY a ; 

SQL은 결과를 결합, 각 테이블에 집계 더 나은 일을해야하고의 집계에 할 것보다 집계 재 개별 표의 union. 또한 union all 대신 union을 사용하면 성능에 영향을 미칩니다.

+0

악의적 인 투표가 있습니까? 아니면 이유가 있습니까? –

관련 문제