Алгоритм соединения слиянием сортированных списков: различия между версиями
Перейти к навигации
Перейти к поиску
[отпатрулированная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
м Check Wikipedia, ошибка 57: Автоматическое удаление двоеточия в заголовках с помощью bot_check.py от es:Usuario:Superzerocool |
Нет описания правки |
||
Строка 1: | Строка 1: | ||
'''Алгоритм соединения слиянием сортированных списков''' (merge join, sort merge join, sort-merge join) |
'''Алгоритм соединения слиянием сортированных списков''' (merge join, sort merge join, sort-merge join) — разновидность [[алгоритм соединения (СУБД)|алгоритма соединения]]. |
||
Алгоритм получает на вход 2 таблицы и условие соединения. Результатом его работы является таблица с результатами соединения. |
Алгоритм получает на вход 2 таблицы и условие соединения. Результатом его работы является таблица с результатами соединения. |
||
Строка 34: | Строка 34: | ||
</pre> |
</pre> |
||
== |
== Преимущества == |
||
* Соединение слиянием эффективнее, чем [[алгоритм соединения вложенными циклами]], при условии, что списки изначально были отсортированы. В принципе, накладные расходы на сортировку могут быть распределены между несколькими операциями соединения. |
* Соединение слиянием эффективнее, чем [[алгоритм соединения вложенными циклами]], при условии, что списки изначально были отсортированы. В принципе, накладные расходы на сортировку могут быть распределены между несколькими операциями соединения. |
||
* Соединение слиянием в отличие от [[алгоритм соединения хэшированием|соединения с использованием хэширования]] может использоваться при больших размерах соединяемых таблиц. |
* Соединение слиянием в отличие от [[алгоритм соединения хэшированием|соединения с использованием хэширования]] может использоваться при больших размерах соединяемых таблиц. |
||
* Соединение слиянием может использоваться для соединений с условиями отличными от равенства, чего не позволяет [[алгоритм соединения хэшированием]]. Однако допустимы не любые условия соединения. |
* Соединение слиянием может использоваться для соединений с условиями отличными от равенства, чего не позволяет [[алгоритм соединения хэшированием]]. Однако допустимы не любые условия соединения. |
||
== |
== Недостатки == |
||
* Главным недостатком алгоритма является необходимость в предварительной сортировке списков. Накладные расходы на сортировку могут быть неприемлемо высокими. |
* Главным недостатком алгоритма является необходимость в предварительной сортировке списков. Накладные расходы на сортировку могут быть неприемлемо высокими. |
||
* При реализации в [[СУБД]], соединение слиянием требует больше памяти и менее гибко, чем [[алгоритм соединения вложенными циклами]].Многие авторы, в связи с этим, на практике рекомендуют избегать этого вида соединения. Во многих СУБД соединение слиянием по умолчанию не используется оптимизатором запросов и должно быть включено явно. |
* При реализации в [[СУБД]], соединение слиянием требует больше памяти и менее гибко, чем [[алгоритм соединения вложенными циклами]]. Многие авторы, в связи с этим, на практике рекомендуют избегать этого вида соединения. Во многих СУБД соединение слиянием по умолчанию не используется оптимизатором запросов и должно быть включено явно. |
||
==Ссылки== |
== Ссылки == |
||
* [http://www.sql.ru/articles/mssql/2007/051102mergejoin.shtml#20 Craig Freedman: Материалы статьи Merge Join] |
* [http://www.sql.ru/articles/mssql/2007/051102mergejoin.shtml#20 Craig Freedman: Материалы статьи Merge Join] |
||
Версия от 23:11, 19 ноября 2013
Алгоритм соединения слиянием сортированных списков (merge join, sort merge join, sort-merge join) — разновидность алгоритма соединения.
Алгоритм получает на вход 2 таблицы и условие соединения. Результатом его работы является таблица с результатами соединения.
Входные таблицы должны быть отсортированы по столбцам, участвующим в условии соединения. Соединение осуществляется за одно сканирование (проход по) каждой из входных таблиц. То есть одна и та же строка считывается только один раз, что даёт преимущество перед соединением вложенными циклами.
Простой пример на псевдокоде:
//нужно соединить Таблицу 1 и Таблицу 2 //по условию: Таблица1.Колонка1 = Таблица2.Колонка2 //Для упрощения примера будем считать, что значения в Колонке2 уникальны Таблица1.Сортировать(Колонка1); Таблица2.Сортировать(Колонка2); Таблица1.ВстатьНаПервуюЗапись; Таблица2.ВстатьНаПервуюЗапись; Пока Таблица1.НеПоследняяЗапись и Tаблица2.НеПоследняяЗапись { Пока Таблица1.Колонка1 < Taблица2.Колонка2 Таблица1.ПерейтиКСледующейЗаписи; Если Таблица1.Колонка1 = Таблица2.Колонка2 { Вывести (Таблица1.ТекущаяЗапись, Таблица2.ТекущаяЗапись); Таблица1.ПерейтиКСледующейЗаписи; } Пока Таблица1.Колонка1 > Таблица2.Колонка2 { Таблица2.ПерейтиКСледующейЗаписи; } }
Преимущества
- Соединение слиянием эффективнее, чем алгоритм соединения вложенными циклами, при условии, что списки изначально были отсортированы. В принципе, накладные расходы на сортировку могут быть распределены между несколькими операциями соединения.
- Соединение слиянием в отличие от соединения с использованием хэширования может использоваться при больших размерах соединяемых таблиц.
- Соединение слиянием может использоваться для соединений с условиями отличными от равенства, чего не позволяет алгоритм соединения хэшированием. Однако допустимы не любые условия соединения.
Недостатки
- Главным недостатком алгоритма является необходимость в предварительной сортировке списков. Накладные расходы на сортировку могут быть неприемлемо высокими.
- При реализации в СУБД, соединение слиянием требует больше памяти и менее гибко, чем алгоритм соединения вложенными циклами. Многие авторы, в связи с этим, на практике рекомендуют избегать этого вида соединения. Во многих СУБД соединение слиянием по умолчанию не используется оптимизатором запросов и должно быть включено явно.
Ссылки
Для улучшения этой статьи желательно:
|