Существуют ли практические правила для разработчиков, когда использовать объединение вместо подзапроса, или они одинаковы.
Присоединить запрос или подзапрос
Ответы (8)
Зависит от СУБД. Вы должны сравнить планы выполнения для обоих запросов.
По моему опыту работы с Oracle 10 и 11, планы выполнения всегда одинаковы.
Первый принцип: «Точно сформулируйте запрос». Второй принцип — «сформулируйте запрос просто и ясно» (именно здесь вы обычно делаете выбор). Третье — «сформулировать запрос так, чтобы он обрабатывался эффективно».
Если это СУБД с хорошим процессором запросов, эквивалентные схемы запросов должны приводить к одинаковым (или, по крайней мере, одинаково эффективным) планам запросов.
Мое самое большое разочарование при первом использовании MySQL заключалось в том, насколько сознательным я должен был быть, чтобы предвосхитить оптимизатор. Имея длительный опыт работы с Oracle, SQL Server, Informix и другими продуктами СУБД, я очень редко ожидал, что буду заниматься такими вопросами. Теперь с более новыми версиями MySQL лучше, но мне все еще приходится обращать внимание на это чаще, чем на другие.
По производительности они не имеют никакой разницы в большинстве современных движков БД.
Проблема с подзапросами заключается в том, что у вас может закончиться подмножество результатов без какого-либо ключа, поэтому их объединение будет более дорогим.
Если возможно, всегда старайтесь делать запросы JOIN и фильтровать с предложением ON, а не с WHERE (хотя оно должно быть таким же, поскольку современные движки оптимизированы для этого).
Теоретически каждый подзапрос можно превратить в запрос на соединение.
Как и во многих других случаях, это зависит. - насколько сложен подзапрос - в запросе как часто выполняется подзапрос
Я стараюсь избегать подзапросов, когда могу. В частности, при ожидании больших наборов результатов никогда не используйте подзапросы - в случае, если подзапрос выполняется для каждого элемента набора результатов.
береги себя, Алекс
Давайте пока проигнорируем влияние на производительность (как и следовало бы, если бы мы знали, что «преждевременная оптимизация — корень всех зол»).
Выберите то, что выглядит четче и проще в обслуживании.
В SQL Server коррелированный подзапрос обычно работает хуже, чем соединение или, что часто даже лучше, чем соединение с производной таблицей. Я почти никогда не пишу подзапрос для чего-то, что нужно будет выполнять несколько раз. Это связано с тем, что коррелированные подзапросы часто в основном превращают ваш запрос в курсор и запускают по одной строке за раз. В базах данных обычно лучше делать что-то на основе наборов.