我创建了一个查询,该查询可以返回具有 YTD、去年、前一年和前一年的不同列的特定组的所有收入。
它的工作原理非常缓慢,而且由于我使用的子查询,我可以告诉它。我最近开始了一份新工作,以前在 MSSQL 上使用子查询不是问题,对性能几乎没有影响,但我想知道这是否是 Postgres 的问题?
我在我运行的最后一个查询中限制了 10 行,并且花了 3 分钟才恢复 10 行。
代码:
SELECT
g.id,
COALESCE(g.description, '') AS description,
(select sum(d.total) from ainvdet d inner join ainvhead h USING (ainvheadid) where d.product_group = g.id and date_part('year', h.order_date) = date_part('year', current_date)) as salesytd,
(select sum(d.total) from ainvdet d inner join ainvhead h USING (ainvheadid) where d.product_group = g.id and date_part('year', h.order_date) = date_part('year', current_date)-1) as salesytd1,
(select sum(d.total) from ainvdet d inner join ainvhead h USING (ainvheadid) where d.product_group = g.id and date_part('year', h.order_date) = date_part('year', current_date)-2) as salesytd2,
(select sum(d.total) from ainvdet d inner join ainvhead h USING (ainvheadid) where d.product_group = g.id and date_part('year', h.order_date) = date_part('year', current_date)-3) as salesytd3
FROM grpdesc g
WHERE g.company = 1 AND g.record_type = 'G'
GROUP BY g.id, g.description
如果没有完整的表定义和索引,就无法确定,但这很可能是查询编写不佳的情况。
这应该返回相同的结果,但要求查询引擎访问行一次,而不是四次(每个子查询一次)。
我尽量保持我的答案与 DB 无关,但正如A Horse With No Name指出的那样,代替
CASE
您可以使用的语句:你也可以试试:
您必须检查自己系统硬件的性能——我怀疑@bbaird 可能会稍微快一点!就像他的解决方案一样,从到没有 4
JOIN
秒!header
line