Влияет ли порядок JOIN против WHERE в SQL на производительность? - PullRequest
1 голос
/ 14 апреля 2020

В SQL, насколько порядок JOIN по сравнению с WHERE влияет на производительность запроса?

a) SELECT […] FROM A JOIN (* 1006) * ВЫБРАТЬ […] ИЗ B ГДЕ СОСТОЯНИЕ ) ВКЛ […]

b) ВЫБРАТЬ […] ИЗ A ПРИСОЕДИНИТЬСЯ ( ВЫБРАТЬ […] ИЗ B ) ВКЛ […] ГДЕ СОСТОЯНИЕ

Мое внутреннее чувство подсказывает мне, что вариант а) должен быть более производительным: если сначала мы выполняем объединение, а затем запускаем метод where, который кажется менее производительным, чем первый запуск метода where на одной таблице и из результатов, выполняющих объединение. Но я не уверен, так как это зависит от внутренней оптимизации самой библиотеки SQL.

Было бы неплохо узнать, одинаково ли поведение для MySQL и PostgreSQL, а также если это зависит от любых других декораторов как group by или order by.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Postgres имеет интеллектуальный оптимизатор, поэтому в большинстве случаев две версии должны иметь схожие планы выполнения (я вернусь к этому чуть позже).

MySQL имеет тенденцию материализовать подзапросы , Хотя это стало лучше в более поздних версиях, я все же рекомендую избегать этого. Материализация подзапросов предотвращает использование индексов и может оказать существенное влияние на производительность.

Одно предостережение: если подзапрос сложный, то может быть лучше выполнить фильтрацию как часть подзапроса. Например, если это агрегация, то фильтрация до агрегации обычно приводит к повышению производительности. Тем не менее, Postgres уместен в добавлении условий в подзапрос. Таким образом, если внешняя фильтрация используется для ключа, используемого в агрегации, Postgres достаточно умен, чтобы вывести sh условие в подзапрос.

1 голос
/ 14 апреля 2020

При прочих равных условиях я бы ожидал, что версия A будет работать лучше, чем версия B, как вы, вероятно, и ожидаете. Основная причина этого заключается в том, что версия A позволяет базе данных выбрасывать строки с помощью предложения WHERE в подзапросе. Тогда соединение должно включать меньшую промежуточную таблицу. Точная разница в производительности между ними будет зависеть от базовых данных и фактических запросов. Обратите внимание, что даже возможно, что оба запроса могут быть оптимизированы под одним и тем же или очень похожим планом выполнения.

...