Будет ли BULK INSERT работать для ускорения измельчения XML в многомерное SQL серверное хранилище данных? - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь ускорить процесс измельчения XML файлов в многомерное хранилище данных. Я имею дело с миллионами XML файлов. Каждый файл XML представляет собой отдельный документ (без повторяющихся шаблонов узлов).

Было высказано предположение, что BULK INSERT будет намного быстрее, чем мой текущий метод RBAR, но я не понимаю, как BULK INSERT будет работать в моей ситуации.

В настоящее время я анализирую элемент в файле XML и проверяю, представлен ли он в соответствующей одной из моих таблиц измерений. Если элемент уже находится в таблице измерений, я получаю ключевое значение таблицы измерений. Если его нет в таблице измерений I INSERT, это в таблице измерений и получить значение ключа вставленной записи. Затем я использую ключевое значение таблицы измерений вместе с другим значением ключа, указанным c для записи таблицы фактов, над которой я работаю, чтобы обновить таблицу перекрестных ссылок, которая связывает мои таблицы фактов и измерений.

Для соответствия отношениям «многие ко многим» у меня есть семь таблиц перекрестных ссылок, которые соединяют мою таблицу фактов и семь различных таблиц измерений. Каждая таблица перекрестных ссылок в настоящее время содержит около миллиона строк.

Каждая таблица перекрестных ссылок имеет всего 2 столбца, которые вместе составляют первичный ключ таблицы. Один из этих столбцов также является FK для таблицы фактов; другой - FK к таблице размеров. Каждая таблица перекрестных ссылок имеет кластеризованный индекс по паре столбцов PK, а также отдельные некластеризованные индексы по каждому из столбцов FK.

Я написал специальное приложение для удаления XML в DW , используя параметризованные хранимые процедуры (SQL Сервер).

Уничтожение одного XML файла может включать около сотни INSERT операций и десятки DELETE операций примерно с 25 различными таблицами. (Многие из файлов XML представляют собой обновленные версии более старых файлов XML, ранее зашифрованных в DW.) Каждый INSERT/DELETE включает обновление индекса. Итак, есть проблема с производительностью. Я попытался удалить все индексы, но это не улучшило производительности; вероятно, потому что мое приложение выполняет множество SELECT операций (поэтому у меня есть индексы).

Как BULK INSERT будет работать в приведенном выше сценарии? Если я правильно понимаю BULK INSERT, идея состоит в том, чтобы накапливать записи партиями, скажем, по 1000 записей, а затем BULK INSERT все в одной партии go. Но каждый из моих файлов XML требует обновления десятков таблиц. Придется ли мне накапливать отдельные пакеты записей, по одной на таблицу, а затем BULK INSERT их одну за другой? Я не понимаю, как это будет работать, поскольку многие из вставляемых записей включают ключевые значения из моего измерения и таблиц фактов. Если новая таблица измерений или запись таблицы фактов находится в пакете, ожидающем следующей операции BULK INSERT, я не смогу получить ее значение ключа, чтобы создать запись для вставки в соответствующую таблицу перекрестных ссылок.

Думаю, мне здесь не хватает чего-то фундаментального, поскольку операции загрузки хранилища данных, в целом похожие на мои, вероятно, довольно распространены.

...