У меня есть запрос, который выполняется каждую ночь в таблице с кучей записей (200 000+). Это приложение просто перебирает результаты (используя DbDataReader в приложении C #, если это уместно) и обрабатывает каждый из них. Обработка выполняется за пределами базы данных в целом. В то время, когда приложение перебирает результаты, я не могу вставить какие-либо записи в таблицу, к которой я обращаюсь. Операторы вставки просто зависают и в конечном итоге время ожидания. Вставки сделаны в совершенно разных приложениях.
Блокирует ли SQL Server таблицу во время выполнения запроса? Это похоже на чрезмерно агрессивную политику блокировки. Я мог понять, как может возникнуть конфликт между запросом и вновь вставленными записями, но я был бы в порядке, если бы записи, вставленные после начала запроса, просто не были включены в результаты.
Есть ли способы избежать этого?
Обновление:
THE WITH (NOLOCK) определенно сделали свое дело. Как некоторые из вас указали, это не самый чистый подход. Я не могу действительно запросить все в память, учитывая количество записей, а некоторые столбцы в этой таблице являются двоичными (некоторые записи на самом деле занимают около 1 МБ общих данных).
Другим предложением было запрашивать партии записей одновременно. Это тоже неплохая идея, но она поднимает новую проблему: запросы к базе данных. Прямо сейчас приложение может работать с различными базами данных (Oracle, MySQL, Access и т. Д.). Каждая база данных имеет свой собственный способ ограничения строк, возвращаемых в запросе. Но, может быть, это лучше сохранить для другого вопроса?
Вернемся к теме. Предложение WITH (NOLOCK) определенно относится к SQL Server. Есть ли способ не допустить этого в мой запрос (и, следовательно, помешать ему работать с другими базами данных)? Может быть, я мог бы как-то указать параметр объекта DbCommand? Или я могу указать политику блокировки на уровне базы данных? То есть изменить некоторые свойства в самом SQL Server, чтобы по умолчанию эта таблица не блокировалась?