Сведение реляционных таблиц в один плоский стол - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь найти наиболее оптимальный способ объединения ряда таблиц в один большой плоский стол с целью создания одного извлечения (по деловым причинам это должен быть один финальный стол)

У нас есть 15 таблиц с 25 миллионами записей, каждая из которых содержит почти 200 столбцов, которые нужно объединить в одну таблицу.К счастью, это непростая задача.

Я считаю, что у нас есть звездообразная схема в терминах хранилища данных, где есть главная системная таблица, в которой каждая запись хранится один раз с бизнес-идентификатором Record_ID, а затем остальные таблицы.являются комбинацией, некоторые хранят каждый Business Record_ID только один раз, в то время как другие будут хранить Business Record_ID несколько раз.Из таблиц с несколькими идентификаторами Business Record_ID, чтобы сгладить их, мы приняли решение взять первые 4/10/12 повторения (в зависимости от того, какая это таблица) и объединить их в столбцы.К сожалению, это означает, что финальная таблица содержит 500 столбцов, которые необходимо заполнить.

Теперь моей первой попыткой было создание представления вокруг внутреннего соединения и объединение всех этих таблиц с основной системной таблицей в Business Record_ID.Однако это оказалось очень ресурсоемким, и через 5 часов администратор базы данных убил его.Оказывается, попытка внутреннего объединения 15 таблиц с 25 миллионами записей в каждой (а также поворот некоторых из них) очень и очень плохая.

Затем я обратился к SSIS и посмотрел, возможно, с использованием преобразования MERGE JOIN, но этодействительно работает только с 2 таблицами одновременно.Я немного поиграл с этой идеей, и мне пришлось бы создавать 2-й стол для достижения этого по одному столу за раз, что-то вроде:

  1. TBL1 + TBL2 --- MERGE JOIN ---> FLAT_TABLE_1
  2. FLAT_TABLE_1 + TBL3 --- MERGE JOIN ---> FLAT_TABLE_2
  3. TRUNCATE FLAT_TABLE_1
  4. FLAT_TABLE_2 + TBL4 --- 101 MERGE JOIN ---_1 FLAT_*
  5. TRUNCATE FLAT_TABLE_2
  6. FLAT_TABLE_1 + TBL5 --- MERGE JOIN ---> FLAT_TABLE_2

Моя последняя мысль состояла в том, чтобы просто использовать сценарии TSQL и записывать напрямую в плоский столиспользуя начальную INSERT системной таблицы в качестве базы, а затем используя функцию UPDATE, чтобы записать все столбцы из других 14 таблиц одну за другой.

Я знаю, что в TSQL есть оператор MERGE, но он посмотрел онлайн , с точки зрения производительности, возможно, лучше остаться с INSERT / UPDATEs.

В любом случае, я надеюсь, что я объяснил свою проблему адекватно, и если есть что-то еще, что мне нужно добавить / объяснить, пожалуйста, дайте мнея знаю.

Edit: мы используем SQL Server / SSIS 2016

1 Ответ

0 голосов
/ 21 ноября 2018

Моя последняя мысль состояла в том, чтобы просто использовать сценарии TSQL и записывать данные напрямую в плоскую таблицу, используя начальную INSERT системной таблицы в качестве базы, а затем использовать функцию UPDATE, чтобы записать все столбцы из других 14 таблиц.на единицу.

Этот подход я бы использовал, учитывая размер задействованных таблиц. Обязательно выполняйте ОБНОВЛЕНИЯ партиями вместо всех строк одновременно.

...