Esta instância hospeda os bancos de dados do SharePoint 2007 (SP). Temos experimentado vários bloqueios SELECT / INSERT em uma tabela muito utilizada no banco de dados de conteúdo do SP. Eu reduzi os recursos envolvidos, ambos os processos estão exigindo bloqueios no índice não clusterizado.
O INSERT precisa de um bloqueio IX no recurso SELECT e o SELECT precisa de um bloqueio S no recurso INSERT. O gráfico de deadlock representa e três recursos, 1.) dois do SELECT (encadeamentos paralelos produtor / consumidor) e 2.) o INSERT.
Anexei o gráfico de deadlock para sua revisão. Como essas são estruturas de código e tabela da Microsoft, não podemos fazer alterações.
No entanto, li no site do MSFT SP que eles recomendam definir a opção de configuração no nível da instância MAXDOP como 1. Como essa instância é compartilhada com muitos outros bancos de dados / aplicativos, essa configuração não pode ser desativada.
Portanto, decidi tentar impedir que essas instruções SELECT fiquem paralelas. Eu sei que isso não é uma solução, mas mais uma modificação temporária para ajudar na solução de problemas. Portanto, aumentei o “Limiar de custo para paralelismo” de nosso padrão de 25 para 40 ao fazer isso, mesmo que a carga de trabalho não tenha sido alterada (SELECT / INSERT ocorrendo com freqüência) e os impasses desapareceram. Minha pergunta é por que?
O SPID 356 INSERT possui um bloqueio IX em uma página pertencente ao índice não agrupado. O
SPID 690 SELECT Execution ID 0 possui um bloqueio S em uma página pertencente ao mesmo índice não agrupado.
Agora
O SPID 356 deseja um bloqueio IX no recurso SPID 690, mas não pode obtê-lo porque o SPID 356 está sendo bloqueado pelo SPID 690 Execution ID 0 S lock O
SPID 690 Execution ID 1 deseja um bloqueio S no recurso SPID 356, mas não pode obtê-lo porque o SPID 690 Execution ID 1 está sendo bloqueado pelo SPID 356 e agora temos nosso impasse.
Plano de execução pode ser encontrado no meu SkyDrive
Detalhes completos do impasse podem ser encontrados aqui
Se alguém pode me ajudar a entender por que eu realmente aprecio isso.
Tabela EventReceivers.
Id uniqueidentifier não 16
Nome nvarchar não 512
SiteId uniqueidentifier não 16
WebId uniqueidentifier não 16
HostId uniqueidentifier não 16
HostType int não 4
ItemId int não 4
DirName nvarchar não 512
LeafName nvarchar não 256
Type int não 4
SequenceNumber int não 4
Assembly nvarchar não 512
Class nvarchar não 512
nvarchar de dados não 512
filtro nvarchar não 512
SourceId tContentTypeId não 512
SourceType int não 4
Credential int não 4
ContextType varbinary não 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 localizado na PRIMÁRIA SiteID, ContextCollectionId
EventReceivers_ByContextObjectId NONCLUSTERED localizado na PRIMÁRIA SiteID, ContextObjectId
EventReceivers_ById NONCLUSTERED, único, localizado em PRIMÁRIA SiteID, Id
EventReceivers_ByTarget cluster, único, localizado em PRIMÁRIA SiteID, webid, HOSTID, HostType, Type, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Classe
EventReceivers_IdUnique chave não clusterizada, exclusiva e exclusiva, localizada na ID PRIMARY
proc_InsertEventReceiver
eproc_InsertContextEventReceiver
fazer que não podemos ver no XDL? Também para reduzir o paralelismo, por que não impactar essas instruções diretamente (usando o MAXDOP 1) em vez de futzing com as configurações do servidor?