我对表格有疑问:

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/

10-11 04:48
查看更多