Таблица заблокирована во время вставки ... сайт недоступен (sql server 2008) - PullRequest
3 голосов
/ 13 сентября 2009

У меня есть фоновый процесс, который постоянно вставляется в таблицу в режиме реального времени. Это может быть тысячи вставок в час (с несколькими обновлениями). Эта же таблица используется веб-приложением для получения данных, необходимых для отображения пользователю.

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

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

Любая помощь и предложения с благодарностью!

Ответы [ 4 ]

4 голосов
/ 13 сентября 2009

Специально для SQL Server вы можете захотеть изменить базу данных, чтобы включить READ_COMMITTED_SHAPSHOT .

Это в основном предотвращает блокировку запросов на выборку, если в данных ожидают вставки / обновления.

3 голосов
/ 13 сентября 2009

Вот некоторые вещи, на которые стоит обратить внимание:

1) Являются ли ваши вставки / обновления или выбранные запросы частью транзакций? Если это так, убедитесь, что вы установили наиболее подходящий уровень изоляции транзакции для вашей конкретной ситуации.

2) У вас слишком много индексов на этой гигантской таблице? Индексы ускоряют выбор, но замедляют вставки и обновления. Убедитесь, что у вас есть только те индексы, которые вам абсолютно необходимы.

3) Относится к # 2. Вам не хватает индексов, которые ускорят ваш выбор? Ваши операторы select выполняют полное сканирование таблицы? Посмотрите на план выполнения запроса, чтобы увидеть, что на самом деле происходит. (Query Analyzer может помочь вам в этом).

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

5) У вас есть триггеры, которые запускают операции вставки / обновления, которые могут вызывать проблемы с производительностью или блокировкой?

6) В вашем приложении происходят заблокированные транзакции? Взгляните на эту статью MSDN на эту тему и посмотрите, поможет ли это. Кроме того, убедитесь, что вы понимаете проблему столовых философов , чтобы избежать блокированных транзакций.

1 голос
/ 13 сентября 2009

Если вы используете Enterprise Edition, идеальным решением будет использование раздвижных окон. По сути, вы создаете идентичную таблицу в той же файловой группе, загружаете данные в указанную таблицу, а затем «переключаете» раздел таблицы в рабочую таблицу. Фактическая операция - это просто метаданные, поэтому она происходит более или менее мгновенно. Посмотрите здесь для получения дополнительной информации: http://technet.microsoft.com/en-us/library/ms191160.aspx

0 голосов
/ 13 сентября 2009

Если вам просто нужно прочитать данные из таблицы в веб-приложении, вы можете попробовать использовать уровень изоляции READ_UNCOMMITTED для запроса. Он не берет никаких блокировок и считывает незафиксированные данные. Я бы не рекомендовал делать это для чего-то вроде банковского приложения, но большинство типичных бизнес-приложений, вероятно, не будет иметь проблем с этим. Обязательно установите уровень изоляции обратно к тому, что вы обычно используете (READ COMMITTED?) После запроса.

Если использование READ_UNCOMMITTED не подходит для вас, вы можете ознакомиться с Уровнями изоляции на основе версий строк . Например, изоляция моментальных снимков использует оптимистический подход к модификации данных, что снижает необходимость пессимистической блокировки строк.

...