Повышение производительности запроса вставки из нескольких таблиц с помощью UNION - PullRequest
0 голосов
/ 09 февраля 2019

Я хочу вставить несколько таблиц в 1 таблицу одновременно.

До этого я пытался объединить все таблицы и создать из них новые таблицы, но это занимает часы.

select * from tables_1_1
union
select * from tables_1_2
union
select * from tables_1_3
union
select * from tables_2_1
...
until
tables_35_3

Я подумал, может быть, введите решение или есть лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я думаю, что вы должны работать, принимая во внимание два фактора:

  1. Характеристики оборудования и сервера
  2. Размер данных

Если вы соответствуете характеристикам машиныработа с ним не очень производительна, и у вас огромный размер данных, тогда распределение операции INSERT (множественная INSERT) повысит производительность, поскольку она не будет потреблять память, как операция UNION.Если размер данных является приемлемым и может обрабатываться выделенной памятью SQL Server, то следует использовать общее табличное выражение с запросом SELECT INTO:

WITH CTE_1 as (SELECT * FROM TABLE_1 
               UNION ALL
               SELECT * FROM TABLE_2
               UNION ALL
               SELECT * FROM TABLE_3)
 SELECT * 
 INTo New_Table
 FROM CTE_1

Также обратите внимание на разницу между UNIONи UNION ALL операции :

Оператор UNION эффективно выполняет SELECT DISTINCT для набора результатов.Если вы знаете, что все возвращаемые записи уникальны для вашего объединения, используйте UNION ALL, это даст более быстрые результаты.Также старайтесь избегать INSERT INTO и использовать вместо него SELECT INTO, поскольку записывается в журнал минимально, при условии, что установлены правильные флаги трассировки .

Еще одна вещь, которую стоит упомянуть, (яне тестировал этот подход, но, возможно, он должен дать лучшую производительность - и это может привести к огромному размеру индекса) вам также следует попытаться создать индексированное представление для всех таблиц (запрос UNIONВы упомянули) , затем выполните запрос, например:

SELECT * INTO ...  FROM vw_Unified

Обновление 1

Если вы знакомы с SSIS, выполнение процесса импорта данных может повысить производительность при использованииSSIS:

0 голосов
/ 09 февраля 2019

@ OP, как я уже упоминал в комментариях, рассмотрите возможность проверки этой темы: Самые быстрые варианты объединения двух таблиц в SQL Server

Некоторые моменты, которые следует выделить:

  • Простое или массовое восстановление и SELECT INTO .. FROM .. UNION ALL приводит к массовым вставкам без конфликтов
  • Если SQL Server 2014+, рассмотрите возможность установки уровня совместимости 110 или выше, это включит паралелизм при загрузке данных
  • Если SQL Server 2017 и финальная таблица будут очень большими, рассмотрите возможность создания отдельной файловой группы в самом быстром хранилище и создания таблицы в этой файловой группе: SELECT * INTO Temp ON [NewFilegroup] FROM Table1.Количество файлов в новой файловой группе предпочтительно равно количеству ядер
  • Не используйте UNION, используйте UNION ALL, в противном случае SQL Server должен дедуплицировать данные всех этих 105 таблиц
  • Данные и файлы журналов в разных хранилищах, чтобы они не мешали друг другу

  • На свой страх и риск: Если скорость загрузки превышает вес, возможен рискрассмотрите ALTER DATABASE dbname SET DELAYED_DURABILITY = ALLOWED; и начните загрузку в транзакции с DELAYED_DURABILITY = ON

Общий отказ от ответственности: этот пост в значительной степени основан на личном мнении


Справочные материалы:

...