To wystąpienie obsługuje bazy danych SharePoint 2007 (SP). Występuje wiele zakleszczeń SELECT / INSERT wobec jednej mocno wykorzystywanej tabeli w bazie danych zawartości SP. Zawęziłem zasoby, oba procesy wymagają blokady indeksu nieklastrowanego.
INSERT potrzebuje blokady IX w zasobie SELECT, a SELECT potrzebuje blokady S w zasobie INSERT. Wykres impasu przedstawia trzy zasoby: 1.) dwa z SELECT (równoległe wątki producent / konsument) i 2.) WSTAW.
Dołączyłem wykres impasu do twojej recenzji. Ponieważ jest to kod Microsoft i struktury tabel, nie możemy dokonywać żadnych zmian.
Jednak przeczytałem na stronie MSFT SP, że zalecają ustawienie opcji konfiguracji poziomu wystąpienia MAXDOP na 1. Ponieważ to wystąpienie jest współużytkowane przez wiele innych baz danych / aplikacji, ustawienia tego nie można wyłączyć.
Dlatego postanowiłem spróbować nie dopuścić do równoległości tych instrukcji SELECT. Wiem, że to nie jest rozwiązanie, ale bardziej tymczasowa modyfikacja, która pomaga w rozwiązywaniu problemów. Dlatego zwiększyłem „próg kosztu dla równoległości” z naszego standardowego 25 do 40, robiąc to, mimo że obciążenie się nie zmieniło (często pojawia się WYBIERZ / WSTAW) impasy zniknęły. Moje pytanie brzmi: dlaczego?
SPID 356 INSERT ma blokadę IX na stronie należącej do indeksu nieklastrowego
SPID 690 SELECT ID wykonania 0 blokuje S na stronie należącej do tego samego indeksu nieklastrowanego
Teraz
SPID 356 chce IX blokady na zasobie SPID 690, ale nie może go utrzymać, ponieważ SPID 356 jest blokowany przez SPID 690 ID wykonania 0 Blokada S
SPID 690 ID wykonania 1 chce blokady S na zasobu SPID 356, ale nie może go uzyskać, ponieważ identyfikator wykonania SPID 690 1 jest blokowany przez SPID 356, a teraz mamy impas.
Plan wykonania można znaleźć na mojej SkyDrive
Pełne szczegóły impasu można znaleźć tutaj
Jeśli ktoś może mi pomóc zrozumieć, dlaczego naprawdę to doceniam.
Tabela EventReceivers.
Identyfikator unikalny nr 16
Nazwa nvarchar nr 512
SiteId unikalny identyfikator nr 16
WebId unikalny identyfikator nr 16
HostId unikalny identyfikator nr 16
HostType int nr 4
ItemId int nr 4
DirName nvarchar nie 512
LiśćName nvarchar nr 256
Typ int nr 4
Sekwencja Numer int 4
Montaż nvarchar nr 512
Klasa nvarchar nie 512
Dane nvarchar nie 512
Filtr nvarchar nie 512
SourceId tContentTypeId nie 512
SourceType int nie 4
Referencje int nie 4
ContextType varbinary nr 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 nieklastrowany się na pierwotnych siteid, ContextCollectionId
EventReceivers_ByContextObjectId nieklastrowany się na pierwotnych siteid, ContextObjectId
EventReceivers_ById nieklastrowany, niepowtarzalny się na pierwotnych siteid, Id
EventReceivers_ByTarget skupione, niepowtarzalny się na pierwotnych siteid, WebId, hostid, HostType, typ, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Class
EventReceivers_IdUnique nieklastrowany, unikalny, unikalny klucz umieszczony na PODSTAWOWYM Id
proc_InsertEventReceiver
iproc_InsertContextEventReceiver
czego nie możemy zobaczyć w XDL? Również, aby zmniejszyć paralelizm, dlaczego po prostu nie wpłynąć bezpośrednio na tę instrukcję (za pomocą MAXDOP 1) zamiast na próżno z ustawieniami całego serwera?