【发布时间】:2019-10-17 04:47:04
【问题描述】:
我要执行:
SELECT cust_id, SUM(cost)
FROM purchases
WHERE purchase_time BETWEEN('2018-01-01', '2019-01-01')
GROUP BY cust_id
但是对于大量行,我希望必须加载每条记录以聚合适当的 SUM。我想要做的是有一个像这样的索引:
CREATE INDEX purchase_sum
ON purchases(cust_id, purchase_time,
SUM(cost) OVER (PARTITION BY cust_id
ORDER BY purchase_time) AS rolling_cost)
我想要一个看起来像这样的索引:
cust_id time rolling_cost
-------- ------ --------------
1 Jan 1 5
1 Jan 2 12
1 Jan 3 14
1 Jan 4 20
1 Jan 5 24
2 Jan 1 1
2 Jan 2 7
2 Jan 3 11
2 Jan 4 14
2 Jan 5 19
3 Jan 1 4
3 Jan 2 5
3 Jan 3 10
3 Jan 4 21
3 Jan 5 45
据此,我的原始查询可以通过简单地为每个 cust_id 减去 2 个已知值来计算,大致为 cost_in_window = rolling_cost('2019-01-01') - rolling_cost('2018-01-01'),这不需要从源表中加载任何内容。
这可以作为索引吗?还是有其他方法可以实现相同的目标?
【问题讨论】:
-
an index that looks like...索引是一种数据结构,例如B树。这不是一张桌子。 -
...考虑跳到支持本机Materialized view的RDMS,这就是您在这里要问的问题。SQL Server支持它
WITH SCHEMABINDING,其索引意味着物化视图是自动的当数据发生变化时更新,或多或少与触发器如何做到这一点相同..