我对表格有疑问:
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
)并针对这些表运行查询时,需要毫秒(创建表也需要毫秒)。是什么导致了如此大的性能差异(至少两个数量级)?
最佳答案
PostgreSQL优化器可能会选择以loop join的形式执行连接。也就是说,它将为每一个左边的行计算函数调用。
使用临时表的解决方案是避免这种情况的一个很好的方法。即使优化器希望再次使用loop join
,结果还是会在临时表中进行大量查找。查找比函数的重复求值便宜一个数量级。
关于sql - 如何提高使用表值函数的查询的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15855767/