1

我在 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; 

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

4

1 回答 1

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;
于 2015-09-09T03:57:36.740 回答