2015-09-09 3 views
0

У меня есть подзапрос в where where, который сканирует полную таблицу при каждом ее вычислении.PostgreSQL предотвращает встраивание подзапроса с помощью OFFSET 0

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», не работает в этом случае в том месте где?

+1

Покажите '' explain' или объяснить analyze', когда речь идет о планах запросов пожалуйста. Если вы обфускаете/анонимизируете запрос, убедитесь, что он точно соответствует плану запроса. –

ответ

0

Предполагая, что среднее вычисляется для большинства значений n используйте КТР для лучшей производительности:

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;