Удаление / Обновление / Вставка данных в правильном порядке MSSQL -> MySQL

Моя проблема в настоящее время выглядит следующим образом:

У меня есть стол A, который копирует элементы в таблицу переноса на основе того, произошла ли транзакция Обновление, Вставка или Удаление в таблице A т.е.

Таблица A -> новая вставка

Триггер активирует и вставляет строку в таблицу переноса с двумя другими столбцами - DateQueried а также QueryType (Куда DateQueried дата срабатывания триггера и QueryType это "Удалить", "Вставить" или "Обновить" в зависимости от типа триггера)

Однако теперь мне нужно перенести эти данные на веб-сервер по связанной таблице (все это нормально и делает как надо). В настоящее время у меня есть скрипт PowerShell для этого. Сценарий выполняет следующие действия:

  • Выберите все значения из моей таблицы перевода, заказы по datequeried
  • Запустите цикл foreach, который запускает хранимую процедуру для вставки / обновления / удаления этого значения на веб-сервере, в зависимости от значения QueryType,

Этот метод очень медленный, сценарий выполняется с 30-минутным таймером, и мы можем столкнуться с ситуацией, когда мы получаем более 100000 строк в течение этого 30-минутного периода времени, что означает 100000 подключений к БД через сценарий PowerShell (особенно при наличии 15 таблиц что нужно пройти через этот процесс).

Есть ли лучший способ получить эти значения, запустив внутреннее соединение? Ранее я просто запускал всю таблицу сразу через хранимую процедуру, которая удаляла бы все значения со второго сервера с QueryType удалить, затем запустить вставки, а затем обновления. Однако у этого были некоторые проблемы, если человек должен был создать новую работу, затем удалить работу, затем заново создать работу, затем обновить работу, а затем снова удалить работу. Моя хранимая процедура будет обрабатывать все удаления, ТОГДА все вставки, ТОГДА все обновления, поэтому, даже если строка была удалена, она пойдет и вставит ее снова.

Затем я перенастроил его еще раз и вместо этого передал только первичные ключи, и всякий раз, когда я запускал хранимую процедуру, она обрабатывает удаления на основе первичных ключей, затем для вставок и обновлений сначала присоединяется к исходной таблице первичных ключей (что, если был ранее удален, не даст результатов и, следовательно, не будет вставлен). Но я столкнулся с проблемой, когда запрос жевал слишком много ресурсов для процесса и время от времени бомбил сервер (ему приходилось пытаться объединить> 100000 результатов в таблицу, содержащую более 10 миллионов строк). Также была другая проблема, когда вставлялась строка с только нулевыми значениями для каждого столбца, где соединение не работало. Затем, когда это произойдет снова, возникнет ошибка первичного ключа, и хранимая процедура остановится.

Есть ли еще один вариант, который я упускаю из виду, который бы значительно ускорил процесс или я просто застрял с ограничениями на сервере, и, возможно, мне придется предположить, что компания обрабатывает загрузки только в конце каждого дня, а не через 30 минут? график они хотели бы?

1 ответ

Придерживайтесь массового удаления / вставки / обновления заказа.

Но:

  • Вставляйте только те строки, в которых нет более позднего удаления (все изменения в любом случае будут потеряны).
  • Обрабатывать только те обновления, в которых нет более поздних строк вставки или удаления (все изменения будут перезаписаны)
Другие вопросы по тегам