Questa istanza ospita i database di SharePoint 2007 (SP). Abbiamo riscontrato numerosi deadlock SELECT / INSERT su una tabella fortemente utilizzata nel database del contenuto SP. Ho ristretto le risorse coinvolte, entrambi i processi richiedono blocchi sull'indice non cluster.
INSERT richiede un blocco IX sulla risorsa SELECT e SELECT richiede un blocco S sulla risorsa INSERT. Il grafico del deadlock mostra tre risorse, 1.) due da SELECT (thread parallele produttore / consumatore) e 2.) INSERT.
Ho allegato il grafico del deadlock per la tua recensione. Poiché si tratta di codice Microsoft e strutture di tabelle, non è possibile apportare modifiche.
Tuttavia, sul sito MSFT SP ho letto che raccomandano di impostare l'opzione di configurazione a livello di istanza MAXDOP su 1. Poiché questa istanza è condivisa tra molti altri database / applicazioni, questa impostazione non può essere disabilitata.
Pertanto, ho deciso di provare a impedire che queste istruzioni SELECT diventassero parallele. So che questa non è una soluzione ma più una modifica temporanea per aiutare con la risoluzione dei problemi. Pertanto, ho aumentato la "Soglia di costo per il parallelismo" dai nostri standard da 25 a 40 dopo averlo fatto, anche se il carico di lavoro non è cambiato (SELECT / INSERT che si verificano frequentemente) i deadlock sono scomparsi. La mia domanda è: perché?
SPID 356 INSERT ha un blocco IX su una pagina appartenente all'indice non cluster
SPID 690 SELECT ID esecuzione 0 ha un blocco S su una pagina appartenente allo stesso indice non cluster
Adesso
SPID 356 desidera un blocco IX sulla risorsa SPID 690 ma non può raggiungerlo perché SPID 356 è bloccato da SPID 690 ID esecuzione 0 Blocco S ID
SPID 690 esecuzione 1 desidera un blocco S sulla risorsa SPID 356 ma non può ottenerlo perché ID esecuzione 690 SPID 1 è stato bloccato da SPID 356 e ora abbiamo il nostro deadlock.
Il piano di esecuzione è disponibile sul mio SkyDrive
I dettagli completi di deadlock sono disponibili qui
Se qualcuno mi può aiutare a capire perché lo apprezzerei davvero.
Tabella EventReceivers.
Id uniqueidentifier no 16
Nome 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
Tipo int no 4
SequenceNumber int no 4
Assemblea nvarchar no 512
Classe nvarchar no 512
Dati nvarchar no 512
Filtro nvarchar no 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
nome_indice index_description index_keys
EventReceivers_ByContextCollectionId cluster situato sulla PRIMARIA SiteID, ContextCollectionId
EventReceivers_ByContextObjectId non cluster trova PRIMARIA SiteID, ContextObjectId
EventReceivers_ById non cluster, unico situato sulla PRIMARIA SiteID, Id
EventReceivers_ByTarget cluster, unico situato sulla PRIMARIA SiteID, WebID, HostId, HOSTTYPE, Tipo, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Class
EventReceivers_IdUnique chiave non cluster, univoca e univoca situata sull'ID PRIMARY
proc_InsertEventReceiver
eproc_InsertContextEventReceiver
cosa non possiamo vedere nell'XDL? Inoltre, per ridurre il parallelismo, perché non avere un impatto diretto su queste affermazioni (utilizzando MAXDOP 1) invece di fallire con le impostazioni a livello di server?