В настоящее время мы работаем с базой данных на SQL Server 2000. База данных постоянно импортирует данные из плоских файлов для последующих запросов. Этот процесс выполняется серией хранимых процедур SQL Server и вызывает BCP
из этих процедур через xp_cmdshell
. Сценарии используют BCP
для чтения плоских файлов в постоянные таблицы во вторичной базе данных на том же сервере. Затем сценарии извлекут данные из таблиц базы данных импорта и поместят их в реальную базу данных, которая нормализуется и используется для запросов.
Обычно этот процесс импорта занимает 5-10 минут в зависимости от размера файлов. Однако на прошлой неделе это длилось 50-60 минут. Мы попробовали пройти через процедуры. Мы заметили, что как только мы создаем временную таблицу, мы не можем запросить tempdb
из другого окна запроса. Но что еще более важно, когда мы можем легко пройти до тех пор, пока мы не усечем первую таблицу импорта. Мы разрешаем выполнение усечения, а затем, когда мы проверяем блокировки в базе данных с помощью sp_lock
, мы видим, что блокировки, принятые усечением, не снимаются. Затем мы разрешаем вызов xp_cmdshell
к BCP
, и он остается там. Мы смотрим на ЦП и ввод-вывод и не видим значительной активности, когда процедура зависает при вызове BCP. Также, когда мы пытаемся это сделать, другие известные запросы не выполняются. Обратите внимание, что сам файл небольшой; максимум 20 строк.
Если мы запустим команду bcp
с xp_cmdshell
из отдельного запроса, она будет работать нормально, но заблокируется, если мы выполнили строку усечения, но еще не выполнили строку BCP
в хранимой процедуре.
Итак, у нас возникают вопросы: почему сервер попадает в это состояние тупика и, что менее важно, почему блокировки, сделанные с помощью truncate, не снимаются?