Что лучше: объединения или несколько операторов под-выбора как часть одного запроса - PullRequest
4 голосов
/ 27 апреля 2011

С точки зрения производительности, что лучше?
Если в моем запросе есть 3 или 4 join оператора или я использую встроенные операторы select для извлечения той же информации из моей базы данных как часть одного запроса?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

Я бы сказал, что объединения лучше, потому что:

  1. Их легче читать.
  2. Вы можете больше контролировать, хотите ли вы выполнить внутреннее, левое / правое внешнее соединение или полное внешнее соединение
  3. операторы объединения нельзя так легко использовать для создания мерзостей запроса
  4. с объединениями проще для оптимизатора запросов для создания быстрого запроса (если внутренний выбор прост, он может работать так же, но с более сложными вещами объединения будут работать лучше ) .
  5. вложенный select может имитировать только left/right outer join.

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

1 голос
/ 27 апреля 2011

Скорее, это зависит от вашей базы данных: от размеров таблиц, в частности, от параметров памяти, а иногда и от того, как таблицы индексируются.

В менее чем текущих версиях MySQL существовала реальная возможностьзапрос с вложенным выбором значительно медленнее, чем запрос, который возвращает те же результаты, структурированные с помощью объединения.(В дни MySQL 4.1 я видел, что разница больше, чем на порядок.) В результате я предпочитаю создавать запросы с объединениями.

Тем не менее, есть некоторые типы запросов, которыеСложно построить с объединением, и единственный выбор - это единственный способ сделать это.

0 голосов
/ 27 апреля 2011

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

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

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

0 голосов
/ 27 апреля 2011

Большинство баз данных оптимизируют оба приведенных ниже запроса в один и тот же план, поэтому, если вы это сделаете:

select A.a1, B.b1 from A left outer join B on A.id = B.a_id

или

select A.a1, (select B.b1 from B where B.a_id = A.id) as b1 from A

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

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