2014-12-02 5 views
-1

Я ищу оптимизировать SQL запрос и хотел бы знать, с точки зрения оптимизации производительности, еслиРегистрация Subquery результат производительности

SELECT A.this, B.another FROM A 
JOIN B 
ON A.this = B.that 
WHERE B.another > 6 
AND A.something < 3; 

лучше:

SELECT A.this, B.another 
FROM (SELECT this FROM A WHERE A.something < 3) AS A 
JOIN (SELECT another FROM B WHERE B.another > 6) AS B 
ON A.this = B.that; 
+0

Postgres имеет довольно умный оптимизатор, поэтому я не думаю, что он материализует подзапросы. Другими словами, обе версии должны иметь схожие характеристики. Но вы действительно должны смотреть на планы запросов. –

+0

Я бы подумал, что такая оптимизация лучше всего оставить в БД, и использование стандартного синтаксиса вашего первого запроса дает оптимизатору большую часть видимости, но я не являюсь администратором базы данных. Мне будет интересно услышать более обоснованные мнения по этому поводу. – Resource

+0

Каков был результат, когда вы пробовали их обоих? Это единственный реальный способ узнать. – Flimzy

ответ

2

два запроса будут идентичны при запуске. Попробуйте запустить два запроса, которым предшествует explain analyze, и вы должны получить тот же план запросов.

В двух словах Postgres проанализирует запрос и придумает дерево запросов.

Это будет затем переписать дерево запроса, когда это необходимо, чтобы удалить лишние вещи, такие как 1 = 1, где положение, заменив небольшой IN() пункт или его эквивалент с помощью ANY, или, в вашем случае, разрушаясь ваши два подзапроса в родительский запрос. Причина этого в том, что в основном это будет выглядеть как select (select ...), при этом внутренний выбор не подвергается общему, групповому или предельному предложению.

Только тогда он проводит некоторое время, анализируя дерево запросов в поисках плана запроса, который он считает достаточно оптимальным. И, наконец, выполните план запроса, чтобы вернуть запрошенные строки.

Для окровавленных деталей вы хотите проверить руководство Postgres на советах по повышению эффективности, а также explain и explain analyze синтаксиса:

Также обратите внимание на список рассылки Postgres производительность, чьи архивы вы найдете здесь:

Изучение их хорошо стоит усилий, в том смысле, что делать это даст у вас есть много идей о том, что происходит под капотом. Обращайте внимание на сообщения, написанные Томом Лейном, в частности - он изредка дает из первых рук информацию о том, что происходит в перезаписывающем устройстве и планировщике запросов.

Смежные вопросы