Этот экземпляр размещает базы данных SharePoint 2007 (SP). Мы сталкивались с многочисленными взаимоблокировками SELECT / INSERT с одной интенсивно используемой таблицей в базе данных контента SP. Я сузил задействованные ресурсы, оба процесса требуют блокировки некластеризованного индекса.
Для INSERT требуется блокировка IX для ресурса SELECT, а для SELECT требуется блокировка S для ресурса INSERT. График взаимоблокировки показывает и три ресурса: 1.) два из SELECT (параллельные потоки производителя / потребителя) и 2.) INSERT.
Я приложил график взаимоблокировки для вашего обзора. Поскольку это код Microsoft и структура таблиц, мы не можем вносить никаких изменений.
Однако на сайте MSFT SP я прочитал, что они рекомендуют установить для параметра конфигурации уровня экземпляра MAXDOP значение 1. Поскольку этот экземпляр является общим для многих других баз данных / приложений, этот параметр нельзя отключить.
Поэтому я решил попытаться предотвратить параллельное выполнение этих операторов SELECT. Я знаю, что это не решение, а скорее временная модификация, чтобы помочь с устранением неполадок. Поэтому я увеличил «Пороговое значение стоимости для параллелизма» с наших стандартных 25 до 40 после этого, даже несмотря на то, что рабочая нагрузка не изменилась (SELECT / INSERT происходит часто), мертвые блокировки исчезли. У меня вопрос почему?
SPID 356 INSERT имеет блокировку IX на странице, принадлежащей некластеризованному индексу.
SPID 690 SELECT ID выполнения 0 имеет блокировку S на странице, принадлежащей тому же некластеризованному индексу.
Сейчас же
SPID 356 хочет получить блокировку IX для ресурса SPID 690, но не может ее получить, поскольку SPID 690 блокируется идентификатором выполнения SPID 690 0 S-блокировка
SPID 690 Идентификатор выполнения 1 требует блокировки S для ресурса SPID 356, но не может получить его, поскольку идентификатор выполнения SPID 690 1 блокируется SPID 356, и теперь у нас есть тупик.
План выполнения можно найти на моем SkyDrive
Полная информация о тупике может быть найдена здесь
Если кто-то может помочь мне понять, почему я был бы очень признателен.
Таблица EventReceivers.
Идентификатор UniqueIdentifier № 16
Названия NVARCHAR нет 512
SiteId UniqueIdentifier нет 16
WEBID UniqueIdentifier нет 16
HOSTID UniqueIdentifier нет 16
HostType Int № 4
ItemId Int № 4
DIRNAME NVARCHAR нет 512
LeafName NVARCHAR № 256
Типа INT № 4
SequenceNumber INT № 4
Сборки NVARCHAR нет 512
Класса NVARCHAR нет 512
данных nvarchar № 512
фильтра nvarchar № 512
SourceId tContentTypeId нет 512
SourceType int нет 4
Credential int нет 4
ContextType varbinary № 16
ContextEventType varbinary № 16
ContextId varbinary № 16
ContextObjectId varbinary № 16
ContextCollectionId varbinary № 16
index_name index_description index_keys
EventReceivers_ByContextCollectionId некластеризованным расположен на PRIMARY SiteId, ContextCollectionId
EventReceivers_ByContextObjectId NONCLUSTERED расположен на PRIMARY SiteId, ContextObjectId
EventReceivers_ById NONCLUSTERED, уникальный , расположенный на PRIMARY SiteId, Id
EventReceivers_ByTarget кластерный, уникальный , расположенный на PRIMARY SiteId, WEBID, НомерУзла, HostType, тип, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Class
EventReceivers_IdUnique некластеризованный, уникальный, уникальный ключ, расположенный на PRIMARY Id
proc_InsertEventReceiver
иproc_InsertContextEventReceiver
что мы не можем видеть в XDL? Кроме того, чтобы уменьшить параллелизм, почему бы просто не воздействовать на эти операторы напрямую (используя MAXDOP 1) вместо того, чтобы использовать настройки для всего сервера?