Индекс для объединения в пакетном процессе SQL ETL - PullRequest
0 голосов
/ 19 февраля 2020

Предположим, у меня есть CTAS в пакетном процессе ETL с таким объединением, как это:

-- SQL Server syntax
SELECT *
INTO output
FROM input1 JOIN input2 on (input1.join_column = input2.join_column)

-- Everyone else
CREATE TABLE output AS 
SELECT *
FROM input1 JOIN input2 on (input1.join_column = input2.join_column)

Есть ли какая-либо польза от наличия индекса (кластеризованного или иного) для input1.join_column или * 1005? * если я ожидаю попадания в каждую строку в обеих таблицах?

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

Мой вопрос в первую очередь касается SQL Сервера, но мне было бы интересно узнать ответ для PostgreSQL.

1 Ответ

2 голосов
/ 19 февраля 2020

Индекс, вероятно, поможет, но это зависит.

Базы данных имеют множество различных способов обработки объединений:

  • Вложенные циклы (циклически проходя по одной таблице, затем по другой ).
  • Гнездо зацикливается с индексом (просматривая одну таблицу и просматривая значения в другой).
  • Сортировка таблиц и объединение.
  • Использование индекса для сортировки таблиц и слияния.
  • Хеширование.

(И вариаций на них больше!)

Выбор оптимизатора зависит от возможностей базы данных, аппаратное обеспечение, данные и статистика.

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

Хеширование и объединение (без индекса) требуют чтения и записи данных для промежуточных структур данных. На практике это может замедлить работу алгоритмов - даже если теоретическая производительность выше.

Так что, да, индекс может быть весьма полезен для запросов такого типа.

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