Присоединить запрос или подзапрос

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


person user26087    schedule 18.03.2009    source источник


Ответы (8)


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

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

person zendar    schedule 18.03.2009

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

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

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

person dkretz    schedule 18.03.2009

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

person mmx    schedule 18.03.2009

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

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

person Seb    schedule 18.03.2009

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

person Andrew Hare    schedule 18.03.2009
comment
Верно ли это для коррелированных подзапросов? Почему вы квалифицируетесь теоретически? Можете ли вы завершить свой ответ на вопрос? - person dkretz; 22.04.2012

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

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

береги себя, Алекс

person Alex    schedule 18.03.2009

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

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

person Milen A. Radev    schedule 18.03.2009

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

person HLGEM    schedule 18.03.2009