Optimizing multiple joins

后端 未结 3 586
悲&欢浪女
悲&欢浪女 2021-02-04 07:14

I\'m trying to figure out a way to speed up a particularly cumbersome query which aggregates some data by date across a couple of tables. The full (ugly) query is below along w

3条回答
  •  忘掉有多难
    2021-02-04 07:46

    Building on Craig Young's suggestions, here is the amended query which runs in ~1.8 seconds for the data set I'm working on. That is a slight improvement on the original ~2.0s and a huge improvement on Craig's which took ~22s.

    SELECT
        p.period,
        /* The pivot technique... */
        SUM(CASE envelope_command WHEN 1 THEN body_size ELSE 0 END) AS Outbound,
        SUM(CASE envelope_command WHEN 2 THEN body_size ELSE 0 END) AS Inbound
    FROM
    (
        /* Get days range */
        SELECT date '2009-10-01' + day AS period
        FROM generate_series(0, date '2009-10-31' - date '2009-10-01') AS day
    ) p
        /* Join message information */
        LEFT OUTER JOIN
        (
            SELECT b.body_size, b.body_time::date, e.envelope_command
            FROM body AS b 
                INNER JOIN envelope e ON e.message_id = b.message_id 
            WHERE
                e.envelope_command IN (2, 1)
                AND b.body_time::date BETWEEN (date '2009-10-01') AND (date '2009-10-31')
        ) d ON d.body_time = p.period
    GROUP BY p.period
    ORDER BY p.period
    

提交回复
热议问题