Присоединиться к запросу или подзапросу - PullRequest
5 голосов
/ 18 марта 2009

Существуют ли практические правила для разработчиков, когда использовать join вместо подзапроса, или они одинаковые.

Ответы [ 8 ]

5 голосов
/ 18 марта 2009

Первый принцип - «Точно сформулируйте запрос». Второй принцип - «сформулируйте запрос просто и очевидно» (именно там вы обычно делаете выбор). Третий - «сформулируйте запрос, чтобы он обрабатывался эффективно».

Если это база данных с хорошим процессором запросов, эквивалентные схемы запросов должны приводить к тем же планам запросов (или, по крайней мере, одинаково эффективным).

Мое наибольшее разочарование при использовании MySQL впервые заключалось в том, насколько сознательно я должен был предвидеть оптимизатор. После долгого опыта работы с Oracle, SQL Server, Informix и другими продуктами dbms я очень редко ожидал, что буду заниматься такими проблемами. Сейчас лучше с новыми версиями MySQL, но мне все равно приходится уделять больше внимания, чем другим.

3 голосов
/ 18 марта 2009

Проблема с подзапросами заключается в том, что у вас может не хватить подрезультатов без ключа, поэтому присоединение к ним будет более дорогим.

Если возможно, всегда пытайтесь выполнять запросы JOIN и фильтровать с предложением ON вместо WHERE (хотя оно должно быть таким же, поскольку современные движки оптимизированы для этого).

3 голосов
/ 18 марта 2009

По производительности они не имеют никакой разницы в большинстве современных систем DB.

2 голосов
/ 18 марта 2009

Давайте пока проигнорируем влияние на производительность (как и следовало бы, если бы мы знали, что «Преждевременная оптимизация - корень всех зол»).

Выберите, что выглядит яснее и проще в обслуживании.

2 голосов
/ 18 марта 2009

Как и во многих вещах, это зависит. - насколько сложен подзапрос - в запросе как часто выполняется подзапрос

Я стараюсь избегать подзапросов, когда могу. Особенно, когда ожидаются большие наборы результатов, никогда не используйте подзапросы - если подзапрос выполняется для каждого элемента набора результатов.

береги себя, Alex

2 голосов
/ 18 марта 2009

Зависит от РСУБД. Вы должны сравнить планы выполнения для обоих запросов.

По моему опыту работы с Oracle 10 и 11 планы выполнения всегда одинаковы.

2 голосов
/ 18 марта 2009

Теоретически каждый подзапрос может быть изменен на запрос соединения.

1 голос
/ 18 марта 2009

В SQL Server коррелированный подзапрос обычно работает хуже, чем объединение, а часто даже лучше для производительности, соединение с производной таблицей. Я почти никогда не пишу подзапрос для чего-либо, что должно быть выполнено несколько раз. Это связано с тем, что коррелированные подзапросы часто превращают ваш запрос в курсор и запускают по одной строке за раз. В базах данных, как правило, лучше все делать на основе множеств

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...