【问题标题】:Optimizing a Vertica SQL query to do running totals优化 Vertica SQL 查询以执行运行总计
【发布时间】:2011-08-05 01:08:23
【问题描述】:

我有一个表 S,其中包含这样的时间序列数据:

key   day   delta

对于给定的密钥,可能但不太可能会丢失天数。

我想从增量值(正整数)构造一个累积列,以便将此累积数据插入另一个表。这是我到目前为止所得到的:

SELECT key, day,
   SUM(delta) OVER (PARTITION BY key ORDER BY day asc RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
   delta
FROM S

在我的 SQL 风格中,默认窗口子句是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,但我把它留在那里以便明确。

这个查询真的很慢,比旧的损坏查询慢了一个数量级,它用 0 填充累积计数。对于其他生成累积数字的方法有什么建议吗?

我确实在这里查看了解决方案: Running total by grouped records in table

我使用的 RDBM 是 Vertica。 Vertica SQL 排除了那里的第一个子选择解决方案,它的查询计划器预测第二个左外连接解决方​​案的成本大约是我上面显示的分析形式的 100 倍。

【问题讨论】:

  • 您为此表定义了哪些投影?有多少行和不同的键? “非常慢”有多慢?
  • 表中有多少行?您如何对该表的主投影进行分区/分段?
  • 我很难理解!您能否提供所需输出的示例数据?

标签: sql vertica window-functions cumulative-sum


【解决方案1】:

我认为你基本上就在那里。您可能只需要稍微更新一下语法:

SELECT s_qty, 
   Sum(s_price) 
     OVER( 
       partition BY NULL 
       ORDER BY s_qty ASC rows UNBOUNDED PRECEDING ) "Cumulative Sum" 
FROM   sample_sales;

输出:

S_QTY | Cumulative Sum 
------+----------------
1     | 1000
100   | 11000
150   | 26000
200   | 28000
250   | 53000
300   | 83000
2000  | 103000
(7 rows)

参考链接:

https://dwgeek.com/vertica-cumulative-sum-average-and-example.html/

【讨论】:

    【解决方案2】:

    有时只使用相关子查询会更快:

    SELECT 
        [key]
        , [day]
        , delta
        , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
    FROM S t1
    

    【讨论】:

    • Vertica 不支持这种性质的相关子查询。
    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多