Я пытаюсь найти наиболее оптимальный способ объединения ряда таблиц в один большой плоский стол с целью создания одного извлечения (по деловым причинам это должен быть один финальный стол)
У нас есть 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-й стол для достижения этого по одному столу за раз, что-то вроде:
- TBL1 + TBL2 --- MERGE JOIN ---> FLAT_TABLE_1
- FLAT_TABLE_1 + TBL3 --- MERGE JOIN ---> FLAT_TABLE_2
- TRUNCATE FLAT_TABLE_1
- FLAT_TABLE_2 + TBL4 --- 101 MERGE JOIN ---_1 FLAT_*
- TRUNCATE FLAT_TABLE_2
- FLAT_TABLE_1 + TBL5 --- MERGE JOIN ---> FLAT_TABLE_2
Моя последняя мысль состояла в том, чтобы просто использовать сценарии TSQL и записывать напрямую в плоский столиспользуя начальную INSERT системной таблицы в качестве базы, а затем используя функцию UPDATE, чтобы записать все столбцы из других 14 таблиц одну за другой.
Я знаю, что в TSQL есть оператор MERGE, но он посмотрел онлайн , с точки зрения производительности, возможно, лучше остаться с INSERT / UPDATEs.
В любом случае, я надеюсь, что я объяснил свою проблему адекватно, и если есть что-то еще, что мне нужно добавить / объяснить, пожалуйста, дайте мнея знаю.
Edit: мы используем SQL Server / SSIS 2016