MSSQL:子查询内部或外部的条件

时间:2016-07-20 03:40:44

标签: sql-server subquery conditional-statements

下面两个选项给了我相同的结果,执行时间几乎相同。 请告诉我哪一个在性能方面更好

选项A:条件在子查询中。 执行时间:3秒

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

选项B:条件在子查询之外。 执行时间:3秒

melt

2 个答案:

答案 0 :(得分:0)

除非索引等存在某种与众不同的东西,否则选项A会更好。在执行聚合操作或加入子查询之前消除行。此外,如果选择选项A,则无需按月分组。

想知道,在没有看到数据结构或数据的情况下,为什么你必须加入LU_Month拉月?如果只是日历,您可以使用datepart函数从FT_Payment.day获取月份。如果这一天是某种"因为系统已开启"日计数器,您仍然可以使用日期函数计算月份。可能会使您从使用昂贵的连接获得一个月的速度。只是一个建议。

答案 1 :(得分: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