Hash Join требует полного сканирования таблицы - PullRequest
2 голосов
/ 09 апреля 2010

Итак, я хочу знать, необходимо ли сделать Hash Join между двумя таблицами для полного сканирования таблицы по столбцам?

Если я хочу присоединиться к COL1 с COL2, а COL1 меньше, он выполняет полное сканирование в COL1, создавая Hashmap, а затем выполняет полное сканирование в COL2, используя хэш-функцию sabe.

Это правильно?

1 Ответ

2 голосов
/ 09 апреля 2010

каждая база данных может иметь собственную фактическую реализацию Hash Join . однако я бы сказал, что вероятный метод похож на this

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

По вопросу: is necessary to make a full table scan on the collumns

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

Когда он строит in-memory hash table of the smaller of its two inputs, он вытянет эти строки из таблицы, используя лучший метод, который не обязательно является сканированием таблицы. Если в запросе нет условий для уменьшения количества строк в этой таблице, он будет выполнять сканирование таблицы.

Когда then reads the larger input and probes the in-memory hash table to find matches, он также вытянет эти строки, используя лучший метод, который не обязательно является сканированием таблицы.

если ваш запрос:

SELECT
    *
    FROM BigTable
        INNER JOIN LittleTable ON BigTable.Col=LittleTable.Col

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

если ваш запрос:

SELECT
    *
    FROM BigTable
        INNER JOIN LittleTable ON BigTable.Col=LittleTable.Col
    WHERE LittleTable.Col2 >'2010/01/01' AND LittleTable.Col2<'2010/01/31'

и используется хеш-соединение, оно, скорее всего, создаст хеш-таблицу в памяти из LittleTable, но не использует сканирование таблицы (если есть индекс для использования), а затем проверяет таблицу BigTable, проверяя эти хеш-ключи. Добавьте дополнительный фильтр, чтобы изменить удаление таблицы сканирования на BigTable.

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