PostgreSQL使用偏移量0阻止子查询内联

PostgreSQL使用偏移量0阻止子查询内联,postgresql,indexing,subquery,inlining,Postgresql,Indexing,Subquery,Inlining,我在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; 将偏移量0添加到子查询的末尾时,查询计划没有更改 SELECT k, j FROM tab t1 WHERE t1.x > (SELECT AVERAGE(x) FROM tab

我在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;
将偏移量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; 

关于这一点。在where子句中,“偏移量0”在这种情况下是否不起作用?

假设对大多数
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;

假设计算了大部分
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;

在谈论查询计划时,请显示
解释
解释分析
。如果您混淆/匿名查询,请确保它与查询计划完全匹配。请在谈论查询计划时显示
解释
解释分析
。如果混淆/匿名查询,请确保它与查询计划完全匹配。