2

我有一个表格查询:

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) 并针对这些临时表运行查询时,它需要几毫秒(创建表也需要几毫秒)。

是什么导致了如此大的性能差异(至少两个数量级)?

4

2 回答 2

4

PostgreSQL 优化器可能会选择将您的连接作为循环连接来执行。也就是说,它将评估每个左侧行的函数调用。

您使用临时表的解决方案是避免这种情况的绝佳方法。即使优化器更愿意loop join再次使用,结果也会在临时表中进行大量查找。查找比重复评估函数便宜一个数量级。

于 2013-04-06T20:39:21.183 回答
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
于 2013-04-06T23:50:25.023 回答