【发布时间】:2018-05-24 19:29:11
【问题描述】:
我有一张如下表:
Region Country Manufacturer Brand Period Spend
R1 C1 M1 B1 2016 5
R1 C1 M1 B1 2017 10
R1 C1 M1 B1 2017 20
R1 C1 M1 B2 2016 15
R1 C1 M1 B3 2017 20
R1 C2 M1 B1 2017 5
R1 C2 M2 B4 2017 25
R1 C2 M2 B5 2017 30
R2 C3 M1 B1 2017 35
R2 C3 M2 B4 2017 40
R2 C3 M2 B5 2017 45
我需要在不同的组中找到SUM([Spend],如下所示:
- 整个表中所有行的总支出
- 每个区域的总支出
- 每个地区和国家组的总支出
- 每个地区、国家和广告客户组的总支出
所以我在下面写了这个查询:
SELECT
[Period]
,[Region]
,[Country]
,[Manufacturer]
,[Brand]
,SUM([Spend]) OVER (PARTITION BY [Period]) AS [SumOfSpendWorld]
,SUM([Spend]) OVER (PARTITION BY [Period], [Region]) AS [SumOfSpendRegion]
,SUM([Spend]) OVER (PARTITION BY [Period], [Region], [Country]) AS [SumOfSpendCountry]
,SUM([Spend]) OVER (PARTITION BY [Period], [Region], [Country], [Manufacturer]) AS [SumOfSpendManufacturer]
FROM myTable
但是对于只有 450K 行的表,该查询需要超过 15 分钟。我想知道是否有任何方法可以优化此性能。提前感谢您的回答/建议!
【问题讨论】:
-
您是否尝试过 4 个单独的查询并加入它们的结果?我想那会更快。年(期间)也在这里杀死你。将其设为单独的列,然后对其进行聚合。
-
这似乎不对。 . .除非其中一些关键列真的非常非常大。
-
为什么你使用
year(),因为它已经是数值了? -
@Daniel Marcus 为什么你认为阅读整个表格 4 次会比只阅读一次更快?
-
@user1330974,我认为 Yogesh 的观点是 period 已经是一个数字年份值,因此无需对其执行任何操作
标签: sql sql-server window-functions partition-by