Блокировать вложенный цикл - Block nested loop
А блочно-вложенный цикл (BNL) является алгоритм привыкший присоединиться два отношения в реляционная база данных.[1]
Этот алгоритм[2] это вариация простого соединение вложенного цикла используется для соединения двух отношений и ("внешний" и "внутренний" операнды соединения соответственно). Предполагать . В традиционном соединении с вложенным циклом будет сканироваться один раз для каждого кортежа . Если есть много подходящих кортежей, и особенно если нет применимого индекса для ключа соединения на , эта операция будет стоить очень дорого.
Алгоритм блочного соединения с вложенным циклом улучшает соединение с простым вложенным циклом за счет только сканирования один раз для каждого группа из кортежи. Например, один вариант объединения вложенного цикла блока читает целую страница из кортежи в память и загружает их в хеш-таблица. Затем он сканирует , и исследует хеш-таблицу, чтобы найти кортежи, соответствующие любому из кортежей на текущей странице . Это уменьшает количество сканирований что необходимо.
Более агрессивный вариант этого алгоритма загружает столько же страниц насколько это возможно в доступной памяти, загружая все такие кортежи в хеш-таблицу, а затем повторно просматривая . Это еще больше снижает количество сканирований что необходимо. Фактически, этот алгоритм является частным случаем классического хеш-соединение алгоритм.[нужна цитата ]
Вложенный цикл блока выполняется в I / Os где количество доступных страниц внутренней памяти и и размер и соответственно в страницах. Обратите внимание, что вложенный цикл блока выполняется в Ввод / вывод, если умещается в доступной внутренней памяти.
Рекомендации
- ^ «8.2.1.14 Блокировать соединения доступа с вложенным циклом и пакетным ключом». Справочное руководство по MySQL 5.6. Корпорация Oracle. Получено 2 августа 2015.
- ^ «Блокировать соединение вложенного цикла». MariaDB. MariaDB Corporation Ab. Получено 2 августа 2015.