【问题标题】:PostgreSQL prevent subquery inlining using OFFSET 0PostgreSQL 使用 OFFSET 0 防止子查询内联
【发布时间】:2015-09-09 01:09:32
【问题描述】:

我在 where 子句中有一个子查询,每次评估时都会扫描整个表。

SELECT k, j
FROM tab t1     
WHERE t1.x > (SELECT AVERAGE(x) FROM tab t2 where t1.n = t2.n)
order by k, j 
limit 100;

当我将 OFFSET 0 添加到子查询的末尾时,查询计划没有变化。

SELECT k, j
FROM tab t1     
WHERE t1.x > (SELECT AVERAGE(x) FROM tab t2 where t1.n = t2.n OFFSET 0) 
order by k, j
limit 100; 

参考这个post。优化围栏“OFFSET 0”在这种情况下在 where 子句中不起作用吗?

【问题讨论】:

  • 在讨论查询计划时请显示explainexplain analyze。如果您对查询进行混淆/匿名化,请确保它与查询计划完全匹配。

标签: postgresql indexing subquery inlining


【解决方案1】:

假设为n 的大多数值计算平均值,请使用 CTE 以获得更好的性能:

WITH avg AS (
  SELECT n, average(x) FROM tab GROUP BY n
)
SELECT k, j
FROM tab
JOIN avg USING (n)    
WHERE x > average
ORDER BY k, j
LIMIT 100;

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2018-06-21
    • 2021-08-30
    • 2015-01-24
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多