【发布时间】:2011-01-06 09:52:47
【问题描述】:
我正在尝试找出一种方法来加快一个特别繁琐的查询,该查询按日期在几个表中聚合一些数据。下面是完整的(丑陋的)查询以及EXPLAIN ANALYZE,以显示它是多么可怕。
如果有人可以偷看一下,看看他们是否能发现任何重大问题(这很可能,我不是 Postgres 人),那就太棒了。
就这样吧。查询是:
SELECT
to_char(p.period, 'DD/MM/YY') as period,
coalesce(o.value, 0) AS outbound,
coalesce(i.value, 0) AS inbound
FROM (
SELECT
date '2009-10-01' + s.day
AS period
FROM generate_series(0, date '2009-10-31' - date '2009-10-01') AS s(day)
) AS p
LEFT OUTER JOIN(
SELECT
SUM(b.body_size) AS value,
b.body_time::date AS period
FROM body AS b
LEFT JOIN
envelope e ON e.message_id = b.message_id
WHERE
e.envelope_command = 1
AND b.body_time BETWEEN '2009-10-01'
AND (date '2009-10-31' + INTERVAL '1 DAY')
GROUP BY period
ORDER BY period
) AS o ON p.period = o.period
LEFT OUTER JOIN(
SELECT
SUM(b.body_size) AS value,
b.body_time::date AS period
FROM body AS b
LEFT JOIN
envelope e ON e.message_id = b.message_id
WHERE
e.envelope_command = 2
AND b.body_time BETWEEN '2009-10-01'
AND (date '2009-10-31' + INTERVAL '1 DAY')
GROUP BY period
ORDER BY period
) AS i ON p.period = i.period
EXPLAIN ANALYZE 可以在这里找到:on explain.depesz.com
感谢任何 cmets 或问题。
干杯
【问题讨论】:
-
如果您发布了对该查询重要的架构部分,以及您想要达到的目标的简短英文描述,将会很有帮助。
标签: sql postgresql optimization join