Cette instance héberge les bases de données SharePoint 2007 (SP). Nous avons rencontré de nombreux blocages SELECT / INSERT sur une table fortement utilisée dans la base de données de contenu SP. J'ai réduit les ressources impliquées, les deux processus nécessitent des verrous sur l'index non cluster.
L'INSERT a besoin d'un verrou IX sur la ressource SELECT et le SELECT a besoin d'un verrou S sur la ressource INSERT. Le graphique de blocage représente et trois ressources, 1.) deux du SELECT (threads parallèles producteur / consommateur), et 2.) l'INSERT.
J'ai joint le graphique de blocage pour votre examen. Étant donné qu'il s'agit de structures de code et de table Microsoft, nous ne pouvons apporter aucune modification.
Cependant, j'ai lu, sur le site MSFT SP, qu'ils recommandent de définir l'option de configuration de niveau d'instance MAXDOP sur 1. Puisque cette instance est partagée entre de nombreuses autres bases de données / applications, ce paramètre ne peut pas être désactivé.
Par conséquent, j'ai décidé d'essayer d'empêcher ces instructions SELECT de se mettre en parallèle. Je sais que ce n'est pas une solution mais plutôt une modification temporaire pour aider au dépannage. Par conséquent, j'ai augmenté le «seuil de coût pour le parallélisme» de notre standard 25 à 40 en procédant ainsi, même si la charge de travail n'a pas changé (SELECT / INSERT se produisant fréquemment), les blocages ont disparu. Ma question est pourquoi?
SPID 356 INSERT a un verrou IX sur une page appartenant à l'index non clusterisé
SPID 690 SELECT ID d'exécution 0 a un verrou S sur une page appartenant au même index non clusterisé
Maintenant
Le SPID 356 souhaite un verrou IX sur la ressource SPID 690 mais ne peut pas le contenir car le SPID 356 est bloqué par l'ID d'exécution SPID 690 0 Verrou S
L'ID d'exécution SPID 690 1 veut un verrou S sur la ressource SPID 356 mais ne peut pas l'obtenir car l'ID d'exécution SPID 690 1 est bloqué par le SPID 356 et nous avons maintenant notre blocage.
Le plan d'exécution se trouve sur mon SkyDrive
Les détails complets de l'impasse peuvent être trouvés ici
Si quelqu'un peut m'aider à comprendre pourquoi je l'apprécierais vraiment.
Table EventReceivers.
Id uniqueidentifier no 16
Nom 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 non 512
Data nvarchar non 512
Filter nvarchar non 512
SourceId tContentTypeId non 512
SourceType int non 4
Credential int non 4
ContextType varbinary non 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 nonclustered situé sur PRIMAIRES SiteId, ContextCollectionId
EventReceivers_ByContextObjectId NONCLUSTERED situé sur PRIMAIRES SiteId, ContextObjectId
EventReceivers_ById NONCLUSTERED, unique situé sur PRIMAIRES SiteId, Id
EventReceivers_ByTarget en clusters, situé unique sur PRIMAIRES SiteId, webid, HostId, HostType, Type, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Class
EventReceivers_IdUnique nonclustered, unique, clé unique située sur l'ID PRIMARY
proc_InsertEventReceiver
etproc_InsertContextEventReceiver
que nous ne pouvons pas voir dans le XDL? Aussi pour réduire le parallélisme, pourquoi ne pas avoir un impact direct sur ces instructions (en utilisant MAXDOP 1) au lieu de jouer avec les paramètres à l'échelle du serveur?