CROSS JOIN LATERAL拖累表现

时间:2018-03-10 03:02:34

标签: sql postgresql

我有这个查询,这是解释:https://explain.depesz.com/s/ctSQ

SELECT
    current_day,
    SUM(daily_holdings_eur) as value_eur
FROM (
    SELECT
        DATE(days) AS current_day,
        ts.coin_id,
        GREATEST(0, SUM(ha.value_eur)) AS daily_holdings_eur
    FROM
        GENERATE_SERIES (
            CURRENT_DATE - '2 DAY' :: INTERVAL,
            CURRENT_DATE,
            '1 DAY' :: INTERVAL
        ) days
    LEFT JOIN transaction_summaries ts ON ts.user_id = 1 AND DATE(ts.trade_at) <= days
    CROSS JOIN LATERAL (
        SELECT price_eur * ts.quantity AS value_eur
        FROM historical_data
        WHERE coin_id = ts.coin_id
        ORDER BY DATE(days)<->snapshot_on
        LIMIT 1
    ) AS ha
    GROUP BY days, ts.coin_id
) final
GROUP BY final.current_day
ORDER BY final.current_day

您可以看到问题出在FROM historical_data

我在这里要做的是:

  • 为最新的X天构建一个窗口
  • 在此时间窗口中的每一天,获取所有发生的事务(transaction_summaries,这是一个视图)直到那天(重复多次)
  • 使用CROSS JOIN LATERAL上的historical_data横向获取当天硬币的最佳历史价格,我直接在其中使用乘法并在外部选择中求和。

此查询目前非常昂贵,因为我找不到重用计算数据或其他任何方法的方法。

transaction_summaries

COIN_ID | QUANTITY | TRADE_AT                | USER_ID
--------|----------|-------------------------|--------
1       | -500.0   | 2018-01-13 13:15:58     | 751

historical_data

ID | COIN_ID | SNAPSHOT_ON | PRICE_EUR
---|---------|-------------|----------
1  | 1       | 2017-10-07  | 0.66
2  | 2       | 2017-10-07  | 0.68
3  | 3       | 2017-10-07  | 0.13
4  | 4       | 2017-10-07  | 1.0

这是针对最近7天的投资组合价值,我汇总了截至每天所做的所有交易,并将数量转换为最接近交易snapshot_on的历史价格trade_at

感谢任何提示。

0 个答案:

没有答案