два запроса будут идентичны при запуске. Попробуйте запустить два запроса, которым предшествует explain analyze
, и вы должны получить тот же план запросов.
В двух словах Postgres проанализирует запрос и придумает дерево запросов.
Это будет затем переписать дерево запроса, когда это необходимо, чтобы удалить лишние вещи, такие как 1 = 1
, где положение, заменив небольшой IN()
пункт или его эквивалент с помощью ANY
, или, в вашем случае, разрушаясь ваши два подзапроса в родительский запрос. Причина этого в том, что в основном это будет выглядеть как select (select ...)
, при этом внутренний выбор не подвергается общему, групповому или предельному предложению.
Только тогда он проводит некоторое время, анализируя дерево запросов в поисках плана запроса, который он считает достаточно оптимальным. И, наконец, выполните план запроса, чтобы вернуть запрошенные строки.
Для окровавленных деталей вы хотите проверить руководство Postgres на советах по повышению эффективности, а также explain
и explain analyze
синтаксиса:
Также обратите внимание на список рассылки Postgres производительность, чьи архивы вы найдете здесь:
Изучение их хорошо стоит усилий, в том смысле, что делать это даст у вас есть много идей о том, что происходит под капотом. Обращайте внимание на сообщения, написанные Томом Лейном, в частности - он изредка дает из первых рук информацию о том, что происходит в перезаписывающем устройстве и планировщике запросов.
Postgres имеет довольно умный оптимизатор, поэтому я не думаю, что он материализует подзапросы. Другими словами, обе версии должны иметь схожие характеристики. Но вы действительно должны смотреть на планы запросов. –
Я бы подумал, что такая оптимизация лучше всего оставить в БД, и использование стандартного синтаксиса вашего первого запроса дает оптимизатору большую часть видимости, но я не являюсь администратором базы данных. Мне будет интересно услышать более обоснованные мнения по этому поводу. – Resource
Каков был результат, когда вы пробовали их обоих? Это единственный реальный способ узнать. – Flimzy