Я хотел бы рассмотреть возможность использования другого метода для обновления базовых таблиц. Вместо того, чтобы обновлять эти таблицы в течение 1-2 минут, создайте «теневые» таблицы в другой схеме. (И есть третья схема для временного хранения.) Это позволяет вам работать с таблицами, которые пользователи не видят, а затем переключать их, используя просто операцию метаданных. Тогда вы можете сделать это:
- усечение / повторное заполнение теневых таблиц (2 минуты, а может и меньше, без конфликтов)
- начать транзакцию (менее миллисекунды)
- переместить первичную таблицу в схему хранения, используя команду ALTER SCHEMA ... TRANSFER (в миллисекундах)
- переместить таблицу теней в схему dbo (с точностью до миллисекунды)
- перемещение первичной таблицы в теневую схему (с точностью до миллисекунды)
- зафиксировать транзакцию (с точностью до миллисекунды)
- (необязательно) усекать теневую таблицу, чтобы восстановить некоторое пространство (в секунду)
Одним из недостатков этого решения является то, что у вас будет два набора статистики, индексов и т. Д. Для поддержки. С статистикой у вас должно быть все в порядке, если данные просто увеличиваются и не меняются существенно.
У Адама Хейнса очень подробное описание этого метода (которое я показал ему несколько лет назад) здесь:
http://jahaines.blogspot.com/2009/10/locking-table-while-it-is-being-loaded.html