Firebird SQL:由于合并而查询缓慢或者可以重写

Chr*_*ter 2 sql firebird coalesce

我遇到一些常用查询的性能问题.

SELECT
v.id,
coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref in (1,3,4)), 0) "fv", 
coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref=2), 0) "ivo", 
coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref=5), 0) "iio", 
coalesce((SELECT sum(amount * mvalue) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1), 0) "vw"
FROM productvariant v
Run Code Online (Sandbox Code Playgroud)

因为artjournal是一张大桌子,每天都有成千上万的新唱片,演出变得越来越糟糕.

我有所有ID字段的索引.

有没有办法重写这个语句来加快速度?或者我可以使用不同的方式从artjournal表中检索数据,如果结果为null,则返回0?

谢谢你的想法,

克里斯蒂安

a_h*_*ame 7

看起来你想要一个过滤的聚合:

SELECT v.id,
       sum(case when a.atype_ref in (1,3,4) then a.amount else 0 end) as "fv",
       sum(case when a.atype_ref = 2 then a.amount else 0 end) as "ivo",
       sum(case when a.atype_ref = 5 then a.amount else 0 end) as "iio",
       sum(a.amount * a.mvalue) as "vw"
FROM productvariant v
  LEFT JOIN artjournal a ON a.variant_ref = v.id
WHERE storage_ref = 1
GROUP BY v.id;
Run Code Online (Sandbox Code Playgroud)