2016-04-20 2 views
2

Часто встречаются SELECT, UPDATE, BULK INSERTS, происходящие в базе данных. Таблицы и интенсивная блокировка происходят, и каждый раз BULK INSERT выбирается как жертва взаимоблокировки, и мы теряем некоторые данные из-за сбоя BULK INSERT.Решение проблем с тупиком

SELECT блокирует BULK INSERT, или UPDATE блокирует BULK INSERT каждый раз или наоборот, и все эти утверждения (запросы) поступают из приложения. Мы не используем какие-либо хранимые процедуры (к сожалению, мы не можем использовать хранимые процедуры)

Снимки базы данных READ Готовая, простая модель восстановления, правильно проиндексирована и не обнаружена фрагментация. Статистика обновлена, MAXDOP настроен правильно, оптимизирован для ad hoc workloads = 1, AUTO_UPDATE_STATISTICS_ASYNC ON, Автоматический рост - 500 МБ для mdf и ldf, темп автоматического роста tempdb - 500 мб для mdf и ldf ..btw, все базы данных сидят на такой же диск. Память составляет 6 ГБ. Общий размер баз данных составляет 60 ГБ. SQL Server 2012 Std edition. PageFile.Sys - 9.8 ГБ. Wait Stats - LCK_M_IX (59%), PAGEIOLATCH_SH (25%)

Мне было интересно, если есть способ решить эту проблему?

  1. Есть ли способ заставить Кодекс, исходящий из приложения (план запроса) использовать NO LOCK на SELECT? или любым способом принудительно выполнить любой запрос или любое приложение для входа в xyz для использования NO LOCK?

  2. Есть ли изменение уровня ИЗОЛЯЦИИ, ЧТОБЫ ПРОЧИТАТЬ НЕОБХОДИМОЕ помощь?

  3. Установить приоритет блокировки LOW?

+0

Это довольно большая тема для SO, но вы заглянули в детали, почему это затормозит? Выбирают ли читающие огромные части таблицы или закрывают всю таблицу? –

+0

... что вы ожидаете? «BULK INSERT» предназначен для самостоятельной работы или одновременно с другими операциями «BULK INSERT». Это определенно не будет хорошо сочетаться с другими заявлениями в одной таблице. Можете ли вы «BULK INSERT» в промежуточном столе вместо этого, а затем сделать регулярный «INSERT» оттуда? –

+0

Можете ли вы изменить часть своей рабочей нагрузки на более мелкие партии? Я уверен, что есть более элегантные решения, но это может обеспечить временное облегчение, и это означало бы, что вам не придется перезагружать всю объемную вставку. –

ответ

1

Команда BULK INSERT имеет опцию блокировки стола, которая может помочь в вашей ситуации. Если объемная вставка может получить исключительную блокировку в таблице, в которую вы вставляете, то другие процессы будут заблокированы от использования таблицы до завершения полной вставки. Это должно позволить вашей объемной вставке избегать тупика; однако ожидайте, что другие конкурирующие процессы будут заблокированы и, возможно, перерыв, если объемная вставка будет работать долго.

См. Выдержку ниже из MSDN по адресу https://msdn.microsoft.com/en-us/library/ms188365.aspx.

TABLOCK

Указывает, что блокировка таблицы уровня приобретается в течение всего срока эксплуатации объемной импорта. Таблица может быть загружена одновременно несколькими клиентами, если таблица не имеет индексов и TABLOCK указан. По умолчанию поведение блокировки определяется опцией таблицы блокировка стола при массовой загрузке. Удержание блокировки в течение продолжительности операции массового импорта уменьшает вероятность блокировки на столе, в некоторых случаях может значительно повысить производительность. Информацию о соображениях производительности см. В разделе «Примечания» далее в этом разделе.

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