Массовое обновление базы данных SQL Server 2008 с использованием .Net Application - наиболее производительный метод - PullRequest
1 голос
/ 28 марта 2012

У нас есть приложение, которое публикует большое количество изменений в таблице (таблица 1) в базе данных SQL Server 2000.

Каждая вставка / обновление / удаление запускает триггер в этой таблице и записывает подробности изменения в другую таблицу (таблица 2), включая уникальный ключ таблицы 1.

Затем через определенные промежутки времени приложение .Net опрашивает таблицу 2, чтобы выяснить, есть ли какие-либо обновления, которые необходимо перенести в таблицу, идентичную таблице 1 в базе данных SQL Server 2008 - таблица 3. Процедура берет «верхние 10000» строк изменений и применяет их индивидуально к таблице 3, повторяя процесс до тех пор, пока не останется ни одного. Для обработки каждых 10000 требуется около минуты, включая массовое обновление таблицы 2, чтобы указать, что передача данных завершена.

Каждое обновление таблицы 3 выполняется с использованием уникального ключа, а индексирование таблицы является надежным.

Когда обновление завершено до таблицы 3, таблица 2 обновляется, чтобы показать, что транзакция была применена к базе данных SQL Server 2008.

В таблицу 1 иногда попадают 40000 обновлений, кажется, что они работают нормально, но база данных SQl Server 2008 страдает, когда там обновляются записи.

Какой самый эффективный способ публикации обновлений в таблице 3?

Я думаю, что сервисный брокер может выполнять эту работу, но как мне создать сообщение XML в приложении .Net и поместить его в очередь для применения сервисным брокером - и не вызовет ли это те же проблемы в любом случае - то же самое? Работа выполнена другим процессом.

1 Ответ

0 голосов
/ 28 марта 2012

Использование сервисного брокера волшебным образом не сделает вашу рабочую нагрузку быстрее. Почему вы ожидаете этого?

Наиболее эффективный способ выполнить массовый DML - обычно выполнять его большими партиями для каждого запроса. Это позволяет оптимизатору настроить план запроса для точного количества строк, которые он получит. Если вы выполняете каждое обновление как отдельный запрос, оптимизатор не сможет оптимизировать запросы.

Поэтому я рекомендую вам объединить все обновления в одном операторе слияния. Также включите вставки и удаления в этот единственный запрос слияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...