我对表格有疑问:
SELECT a.id, b.colb, c.colc, d.cold, ...
FROM a JOIN b on a.id=b.id
JOIN c on a.id=c.id
JOIN d on a.id=d.id
JOIN e on a.id=e.id
...
这里的每个表实际上都是一个表值函数。此查询的运行时间超过一分钟,但是当我手动创建临时表(CREATE TEMPORARY TABLE ax as SELECT * from a
)并对这些表运行查询时,它需要几毫秒(并且创建表也需要毫秒)。
可能导致这种巨大的性能差异(至少两个数量级)?
答案 0 :(得分:4)
PostgreSQL优化器可能会选择以loop join的形式执行连接。也就是说,它会评估每个左手行的函数调用。
使用临时表的解决方案是避免这种情况的绝佳方法。即使优化器再次使用loop join
,结果也会在临时表中进行大量查找。查找比重复评估函数便宜一个数量级。
答案 1 :(得分:1)
尝试CTE:
with
a as (select * from a),
b as (select * from b),
c as (select * from c),
d as (select * from d),
e as (select * from e)
select a.id, b.colb, c.colc, d.cold, ...
from a
join b on a.id=b.id
join c on a.id=c.id
join d on a.id=d.id
join e on a.id=e.id