PostgreSQL使用偏移量0阻止子查询内联
我在where子句中有一个子查询,每次计算时它都会扫描整个表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
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;
在谈论查询计划时,请显示
解释
或解释分析
。如果您混淆/匿名查询,请确保它与查询计划完全匹配。请在谈论查询计划时显示解释
或解释分析
。如果混淆/匿名查询,请确保它与查询计划完全匹配。