2016-07-20 4 views
0

아래 2 옵션은 동일한 결과를 얻었으며 실행 시간은 거의 같습니다. 한 성능MSSQL : 하위 쿼리 내부 또는 외부의 조건

옵션 A의 측면에서 더 나은하는 저를 알려 주시기 바랍니다 : 조건은 하위 쿼리입니다. 실행 시간 : 3 SECS

SELECT 
a.Sales_ID, a.Sales_No, a.Sales, b.Collection 
FROM 
(
    SELECT Month, Sales_ID, Sales_No, Sum(Sales) 'Sales' 
    FROM FT_Sales a 
    JOIN LU_Month b on a.Day=b.Day 
    WHERE b.Month=201607 
    GROUP BY Month, Sales_ID, Sales_No 
) a 
JOIN 
(
    SELECT Month, Sales_ID, Sales_No, Sum(Collection) 'Collection' 
    FROM FT_Payment a 
    JOIN LU_Month b on a.Day=b.Day 
    WHERE b.Month=201607 
    GROUP BY Month, Sales_ID, Sales_No 
) b on a.Sales_ID=b.Sales_ID 

옵션 B : 조건은 하위 쿼리 밖에 있습니다. 실행 시간 : 3 SECS

SELECT 
a.Sales_ID, a.Sales_No, a.Sales, b.Collection 
FROM 
(
    SELECT b.Month, Sales_ID, Sales_No, Sum(Sales) 'Sales' 
    FROM FT_Sales a 
    JOIN LU_Month b on a.Day=b.Day 
    GROUP BY b.Month, Sales_ID, Sales_No 
) a 
JOIN 
(
    SELECT b.Month, Sales_ID, Sales_No, Sum(Collection) 'Collection' 
    FROM FT_Payment a 
    JOIN LU_Month b on a.Day=b.Day 
    GROUP BY b.Month, Sales_ID, Sales_No 
) b on a.Sales_ID=b.Sales_ID AND a.Month=b.Month 
WHERE a.Month=201607 
+0

차이점이 있다고 생각하지 않지만 다른 유형의 조인에서는 차이가 생길 수 있습니다. 예 : 왼쪽 조인의 하위 쿼리에있는 where 절은 다른 테이블의 모든 결과를 계속 표시하며 왼쪽 조인의 하위 쿼리 외부에있는 where 절은 근본적으로 내부 조인입니다. – ZLK

+0

계획이 뭐라고 말합니까? –

+0

SQL에서는 시스템에 * * 수행 방법이 아닌 * 원하는 것을 알려줍니다 *. 모든 것이 합리적으로 실행된다고 가정 할 때, 옵티마이 저는 * 동일한 * 논리적 * 결과를 요구하기 때문에 이들에 대한 동일한 계획을 생성해야합니다. –

답변

0

일반 부족 등 인덱싱에 존재하는 무언가가되지 않는 한, 옵션 A는 더 좋을 것이다. 집계 연산을 수행하거나 하위 쿼리를 조인하기 전에 행을 제거하십시오. 또한 옵션 A를 선택하면 월 단위로 그룹화 할 필요가 없습니다.

데이터 구조 나 데이터를 보지 않고도 궁금해하기 때문에 왜 LU_Month에 가입하여 월을 가져 가야합니까? 달력 일 경우 datepart 함수를 사용하여 FT_Payment.day에서 월을 가져올 수 있습니다. 날짜가 "시스템이 켜진 이후"일종의 일 카운터 일 경우 날짜 함수를 사용하여 해당 달을 계산할 수 있습니다. 값 비싼 조인을 사용하여 한 달을 기다리는 것을 가속화 할 수 있습니다. 그냥 제안.

+0

여기에 일반적인 것은 없지만 SQL Server의 최적화 프로그램에서 "술어 푸시"라는 기능이 작동합니다 – dean

0

이 코드를 사용해보십시오. 희망이 도움이 될 것입니다.

SELECT 
a.Sales_ID, a.Sales_No, SUM(a.Sales) AS Sales, SUM(a.Collection) AS Collection 
FROM 
(
    SELECT Month, Sales_ID, Sales_No, Sum(Sales) AS 'Sales', 0 AS 'Collection' 
    FROM FT_Sales a 
    JOIN LU_Month b on a.Day=b.Day 
    WHERE b.Month=201607 
    GROUP BY Month, Sales_ID, Sales_No 
    UNION ALL 
    SELECT Month, Sales_ID, Sales_No, 0 AS 'Sales' , Sum(Collection) AS 'Collection' 
    FROM FT_Payment a 
    JOIN LU_Month b on a.Day=b.Day 
    WHERE b.Month=201607 
    GROUP BY Month, Sales_ID, Sales_No 
) as a