Цей примір розміщує бази даних SharePoint 2007 (SP). Ми зазнали численних тупиків SELECT / INSERT проти однієї широко використовуваної таблиці в базі даних вмісту SP. Я звузив залучені ресурси, обидва процеси вимагають блокування некластеризованого індексу.
INSERT потребує блокування IX на ресурсі SELECT, а SELECT - замок S на ресурсі INSERT. Графік глухого кута зображує і три ресурси, 1.) два з SELECT (паралельні потоки виробник / споживач), і 2.) ВСТАВКА.
Я додав для Вашого огляду графік тупикової ситуації. Оскільки це структура коду та таблиці Microsoft, ми не можемо вносити жодних змін.
Однак я прочитав на сайті MSFT SP, що вони рекомендують встановити параметр конфігурації рівня MAXDOP для інстанцій на 1. Оскільки цей екземпляр поділяється серед багатьох інших баз даних / програм, цей параметр неможливо відключити.
Тому я вирішив спробувати не допустити паралельних цих операцій SELECT. Я знаю, що це не рішення, а більше тимчасова модифікація для вирішення проблем. Таким чином, після цього я збільшив "поріг витрат для паралелізму" з нашого стандарту 25 до 40, навіть якщо навантаження не змінилося (SELECT / INSERT часто трапляються), тупики зникли. Моє питання чому?
SPID 356 INSERT має IX блокування на сторінці, що належить некластеризованому індексу
SPID 690 SELECT Ідентифікатор виконання 0 має S блокування на сторінці, що належить тому ж некластеризованому індексу
Тепер
SPID 356 хоче заблокувати IX на ресурсі SPID 690, але не може його досягти, оскільки SPID 356 блокується SPID 690 Ідентифікатор виконання 0 Блокування
SPID 690 Ідентифікатор виконання 1 вимагає блокування S на ресурсі SPID 356, але не може отримати його, оскільки SPID 690 Ідентифікатор виконання 1 блокується SPID 356, і тепер у нас є глухий кут.
План виконання можна знайти на моєму SkyDrive
Повні відомості про тупик можна знайти тут
Якщо хтось може допомогти мені зрозуміти, чому я б дуже цінував це.
Таблиця приймачів подій
Ідентифікатор 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 no 512
SourceType int no 4
Credential int no 4
ContextType varbinary no 16
ContextEventType varbinary no 16
ContextId varbinary no 16
ContextObjectId varbinary no 16
ContextCollectionId varbinary no 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), а не ф'юшинг із налаштуваннями для всього сервера?