Я много гуглил, и не могу решить эту проблему.
Без выполнения другого запроса, только с профилировщиком SQL и моей собственной копией SQL Management Studio, подключенной к моему серверу.Я запускаю следующее:
delete_more:
DELETE TOP (200) A
FROM someTable
WHERE parentId = 15
IF @@ROWCOUNT > 0 GOTO delete_more;
Запрос любезности Microsoft
При выполнении этого запроса я наблюдаю за профилировщиком SQL Microsoft.Я вижу тысячи сообщений, которые говорят:
Lock:Timeout (51983df52b56)
Lock:Timeout (d89e387017b0)
Lock:Timeout (21d253e7f2bc)
Lock:Timeout (c1e67d683600)
Lock:Timeout (38aa16ffd30c)
Lock:Timeout (008f2176bf79)
В таблице нет триггеров, и внешние ключи не ссылаются на эту таблицу.Столбец в предложении where индексируется.
Кажется, что он удаляет только 100 записей каждые 2-3 секунды.У меня есть около миллиона записей для удаления таким образом, это займет более 8 часов.
Моя машина не работает медленно, и базе данных выделено 8 ГБ ОЗУ.
Я не уверен, что это подсказка, но когда я запускаю профилировщик для базы данных, когда ни одно приложение или люди не выполняют запросы к ней, я постоянно вижу Lock: Acquired и Lock: Released (без запуска операторов SQL, RPC и SP).Это типично?
Я не администратор базы данных, хотя я гуглил.Я играл с:
exec sp_lock
exec sp_who2
... но на самом деле результат не имеет большого значения для меня.Я немного погуглил, чтобы узнать немного о каждом из них и о сценариях других людей, чтобы дать более значимый вывод, но в настоящее время мои знания по MSSQL не достаточно глубоки, чтобы сделать большую часть из этого разумной (я программист без БДпо персоналу).