下面两个选项给了我相同的结果,执行时间几乎相同。 请告诉我哪一个在性能方面更好
选项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
答案 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