Классика баз данных - статьи

       

Соединения


Соединение таблиц является одной из наиболее критичных операций по отношению к оптимизации, поскольку она широко распространена, для ее выполнения требуется много ресурсов, и она имеет много разновидностей. И в DB2/*, и в DB2 для MVS поддерживаются алгоритмы соединения вложенных циклов и сортировки со слиянием с обычной реализацией. Соединения через вложенные циклы и сортировку со слиянием с годами стали сочетаться совместно, поскольку в обоих методах берется внешнее значение предиката соединения и «проталкивается вниз» так, как будто внутренняя таблица ограничивается предикатом на одной таблице.

Основная разница состоит в том, что в случае соединения слиянием оба входных источника должны быть упорядочены (через индекс или путем явной сортировки), и внутренний ввод должен производиться из одной упорядоченной таблицы (базовой или временной), чтобы использовать идентификатор строки (RID) как механизм позиционирования для возврата на более раннюю позицию внутренней таблицы, если во внешней таблице встречается дубликат. Для соединения методом вложенных циклов оптимизаторы DB2 рассматривают возможность сортировки внешней таблицы по столбцами предиката соединения, а в DB2/* даже рассматривается возможность сортировки таблицы перед соединением для позднейшей обработки разделов GROUP BY, ORDER BY или DISTINCT.

В оптимизаторе DB2 для MVS также поддерживается гибридный метод соединения [CHH+91], смесь двух упомянутых методов. Лучше всего его можно охарактеризовать как соединение через вложенные циклы с упорядоченной внешней таблицей и пакетной обработкой RID для внутренней таблицы. Гибридное соединение часто оказывается полезным, когда на внутренней таблице имеются только некластеризованные индексы, и в результате содержится немного строк. Подобно соединению путем слияния, в гибридном соединении обычно требуются, чтобы строки внутреннего и внешнего источников ввода были упорядочены. Подобно соединению через вложенные циклы, не требуется помещать внутреннюю таблицу во временную таблицу, но обеспечивается эффективный доступ к страницам данных внутренней таблицы, поскольку сначала сортируется список RID’ов, а чтение каких-либо страниц данных откладывается до конца соединения. Этот метод эффективно комбинируется с другими методами обработки RID’ов, такими как индексный ANDing.

Если выполняется соединение методом вложенных циклов с использованием индексного сканирования для внутренней таблицы, и внешняя таблица упорядочена в соответствии с предикатом соединения, оптимизатор DB2 для MVS применяет «индексную предысторию» («index look-aside»). При этом запоминается позиция в корневой странице, посещенная в последний раз в индексе внутренней таблицы, что позволяет не обходить нелистовые страницы индекса. В оптимизаторе DB2 для MVS это поведение моделируется везде, где возможно.



Содержание раздела