Из изучения блокировок, снятых различными командами, выполняемыми процедурами DROP, CREATE или ALTER, я полагаю, что вы можете решить вашу конкретную проблему, изменив используемый вами шаблон:
IF OBJECT_ID(N'myProc') IS NULL
EXEC sp_executesql N'Create Proc myProc as RETURN 0'
GO
ALTER PROC myProc
AS ...
Когда я смотрю наблокировки, снятые DROP PROC, я вижу, что:
- блокировки Sch-M снимаются для resource_type = "METADATA.AUDIT_ACTIONS" и resource_type = "METADATA.PERMISSIONS"
- Блокировка Sch-S снята на столе, к которому относится sproc
- все остальные блокировки - X или IX на системных объектах
Когда я смотрю на блокировки, взятые CREATE PROCЯ вижу, что:
- Блокировка Sch-M снята на самой процедуре
- Блокировка Sch-S кратко снята на столе, к которому относится sproc (ивыпущено <- исправлено) </li>
- все другие блокировки - это X или IX для системных объектов
Когда я смотрю на блокировки, взятые ALTER PROC, я вижу, что:
- Блокировка Sch-M снята на самой процедуре
- AnБлокировка Sch-S снята на столе с ранее скомпилированной версией упомянутого sproc (и если только в новой версии будет кратко снята)
- все другие блокировки - X или IX на системных объектах
Поэтому я считаю, что ваши текущие взаимоблокировки связаны с доступом к ресурсам MetaData, и это можно было бы уменьшить, переключившись на шаблон ALTER.
Однако Sch-M и Sch-Замки S будут по-прежнему в игре, просто по-другому - поэтому возможны разные тупики, если у вас есть другие спроки, которые ссылаются друг на друга.
Дополнительный комментарий: Iбыло бы интересно узнать, почему создание объекта занимает так много времени в целом.Помимо тупиков - действительно ли это создает хранимые процедуры, которые занимают время?Я полагаю, что проблема связана с созданием и заполнением таблиц, и я хотел бы убедиться, что у вас настроена Мгновенная инициализация файла, правильно настроены параметры роста файла данных, настроена модель восстановления и / или резервного копирования журналов, и нетпросто ждем, пока файлы вырастут и обнулятся, когда ваши скрипты работают.