2013-05-07 2 views
-1

У меня есть работающая система, в которой данные периодически вставляются в MS SQL DB, а веб-приложение используется для отображения этих данных для пользователей.Каков самый быстрый способ вставить данные в базу данных MS SQL без его блокировки?

Во время ввода данных пользователи должны иметь возможность продолжать использовать БД, к сожалению, я не могу перепроектировать всю систему прямо сейчас. Каждые 2 часа записываются записи 40k-80k.

Сейчас этот процесс выглядит следующим образом: Таблица

  1. Temp создается
  2. данных вставляются в него, используя простые операторы INSERT (параметризованные запросы или хранимые proceuders должны улучшить скорость).
  3. данных перекачиваются из временной таблицы в таблицу назначения с использованием INSERT INTO MyTable(...) SELECT ... FROM #TempTable

Я думаю, что такой подход является очень неэффективным. Я вижу, что фаза вставки может быть улучшена (объемная вставка?), Но как насчет передачи данных из временной таблицы в пункт назначения?

ответ

2

Это waht мы сделали несколько раз. Переименуйте таблицу как TableName_A. Создайте представление, которое вызывает эту таблицу. Создайте вторую таблицу точно так же, как и первую (Tablename_B). Заполните его данными из первого. Теперь настройте процесс импорта, чтобы заполнить таблицу, которая не вызывается представлением. Затем измените представление для вызова этой таблицы. Общее время простоя для пользователей, несколько секунд. Затем перепишем первую таблицу. На самом деле проще, если вы можете усечь и заполнить таблицу, потому что вам не нужен этот последний шаг, но это может быть невозможно, если ваши входные данные не являются полным обновлением.

+0

Кажется, у меня уже много данных в этой таблице. Кажется, копирование потребует некоторого времени. – artvolk

1

Вы не можете избежать блокировки при вставке в таблицу. Даже с BULK INSERT это невозможно.

Но клиенты, которые хотят получить доступ к этой таблице во время одновременных операций INSERT, могут сделать это при изменении уровня изоляции транзакций для READ UNCOMMITTED или путем выполнения команды SELECT с опцией WITH NOLOCK.

Команда INSERT по-прежнему блокирует таблицу/строки, но команда SELECT будет игнорировать эти блокировки, а также читать незафиксированные записи.

Смежные вопросы