Diese Instanz hostet die SharePoint 2007-Datenbanken (SP). Wir haben zahlreiche SELECT / INSERT-Deadlocks für eine stark genutzte Tabelle in der SP-Inhaltsdatenbank festgestellt. Ich habe die beteiligten Ressourcen eingegrenzt. Beide Prozesse erfordern Sperren für den nicht gruppierten Index.
Das INSERT benötigt eine IX-Sperre für die SELECT-Ressource und das SELECT benötigt eine S-Sperre für die INSERT-Ressource. Das Deadlock-Diagramm zeigt und drei Ressourcen, 1.) zwei aus dem SELECT (Producer / Consumer Parallel Threads) und 2.) das INSERT.
Ich habe das Deadlock-Diagramm für Ihre Überprüfung angehängt. Da es sich um Microsoft-Code- und -Tabellenstrukturen handelt, können wir keine Änderungen vornehmen.
Ich habe jedoch auf der MSFT SP-Site gelesen, dass empfohlen wird, die Konfigurationsoption auf MAXDOP-Instanzebene auf 1 zu setzen. Da diese Instanz von vielen anderen Datenbanken / Anwendungen gemeinsam genutzt wird, kann diese Einstellung nicht deaktiviert werden.
Daher habe ich beschlossen, zu verhindern, dass diese SELECT-Anweisungen parallel verlaufen. Ich weiß, dass dies keine Lösung ist, sondern eher eine vorübergehende Änderung, um bei der Fehlerbehebung zu helfen. Daher habe ich den „Kostenschwellenwert für Parallelität“ von 25 auf 40 erhöht, obwohl sich die Arbeitslast nicht geändert hat (SELECT / INSERT tritt häufig auf), sind die Deadlocks verschwunden. Meine Frage ist warum?
SPID 356 INSERT verfügt über eine IX-Sperre für eine Seite, die zum nicht gruppierten Index gehört.
SPID 690 SELECT Die Ausführungs-ID 0 verfügt über eine S-Sperre für eine Seite, die zu demselben nicht gruppierten Index gehört
Jetzt
SPID 356 möchte eine IX-Sperre für die SPID 690-Ressource, kann sie jedoch nicht erhalten, da SPID 356 durch die SPID 690-Ausführungs-ID 0 blockiert wird. S-Sperre
SPID 690 Die Ausführungs-ID 1 möchte eine S-Sperre für die SPID 356-Ressource, kann sie jedoch nicht erhalten, da die SPID 690-Ausführungs-ID 1 wird von SPID 356 blockiert und jetzt haben wir unseren Deadlock.
Der Ausführungsplan befindet sich auf meinem SkyDrive
Vollständige Deadlock-Details finden Sie hier
Wenn mir jemand helfen kann zu verstehen, warum ich es wirklich schätzen würde.
EventReceivers-Tabelle.
ID uniqueidentifier no 16
Name nvarchar no 512
SiteId uniqueidentifier no 16
WebId uniqueidentifier no 16
HostId uniqueidentifier no 16
HostType int no 4
ItemId int no 4
DirName nvarchar no 512
LeafName nvarchar no 256
Type int no 4
SequenceNumber int no 4
Assembly nvarchar no 512
Class nvarchar nein 512
Daten nvarchar nein 512
Filter nvarchar nein 512
SourceId tContentTypeId nein 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 nicht gruppierten sich auf PRIMARY SITEID, ContextCollectionId
NONCLUSTERED EventReceivers_ByContextObjectId befindet sich auf PRIMARY SITEID, ContextObjectId
EventReceivers_ById Nonclustered, einzigartig gelegen auf PRIMARY SITEID, Id
EventReceivers_ByTarget gruppierten, einzigartig gelegen auf PRIMARY SITEID, webid, HostId, Unterkuntstyp, Typ, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Klasse
EventReceivers_IdUnique nicht gruppierter, eindeutiger, eindeutiger Schlüssel in der PRIMARY-ID
proc_InsertEventReceiver
undproc_InsertContextEventReceiver
tun, was wir in der XDL nicht sehen können? Um die Parallelität zu verringern, sollten Sie diese Anweisung nicht direkt (mit MAXDOP 1) beeinflussen, anstatt mit serverweiten Einstellungen zu arbeiten.