如何提高使用表值函数的查询的性能?

时间:2013-04-06 20:37:44

标签: sql postgresql database-performance

我对表格有疑问:

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

可能导致这种巨大的性能差异(至少两个数量级)?

2 个答案:

答案 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