Esta instancia aloja las bases de datos de SharePoint 2007 (SP). Hemos estado experimentando numerosos puntos muertos SELECT / INSERT contra una tabla muy utilizada dentro de la base de datos de contenido SP. He reducido los recursos involucrados, ambos procesos requieren bloqueos en el índice no agrupado.
INSERT necesita un bloqueo IX en el recurso SELECT y SELECT necesita un bloqueo S en el recurso INSERT. El gráfico de punto muerto muestra tres recursos, 1.) dos de SELECT (subprocesos paralelos de productor / consumidor) y 2.) INSERT.
He adjuntado el gráfico de punto muerto para su revisión. Como se trata de estructuras de tablas y códigos de Microsoft, no podemos realizar ningún cambio.
Sin embargo, he leído, en el sitio de MSFT SP, que recomiendan establecer la opción de configuración de nivel de instancia MAXDOP en 1. Dado que esta instancia se comparte entre muchas otras bases de datos / aplicaciones, esta configuración no se puede deshabilitar.
Por lo tanto, decidí intentar evitar que estas instrucciones SELECT fueran paralelas. Sé que esto no es una solución, sino más bien una modificación temporal para ayudar con la resolución de problemas. Por lo tanto, aumenté el "Umbral de costo para paralelismo" de nuestro estándar de 25 a 40 al hacerlo, a pesar de que la carga de trabajo no ha cambiado (SELECCIONAR / INSERTAR con frecuencia) los puntos muertos han desaparecido. Mi pregunta es por qué
SPID 356 INSERT tiene un bloqueo IX en una página que pertenece al índice no agrupado
SPID 690 SELECCIONAR ID de ejecución 0 tiene bloqueo S en una página que pertenece al mismo índice no agrupado
Ahora
SPID 356 quiere un bloqueo IX en el recurso SPID 690 pero no puede mantenerlo porque SPID 356 está siendo bloqueado por SPID 690 ID de ejecución 0 Bloqueo S
SPID 690 ID de ejecución 1 quiere un bloqueo S en el recurso SPID 356 pero no puede obtenerlo porque SPID 690 ID de ejecución 1 está siendo bloqueado por SPID 356 y ahora tenemos nuestro punto muerto.
El plan de ejecución se puede encontrar en mi SkyDrive
Los detalles completos del punto muerto se pueden encontrar aquí
Si alguien me puede ayudar a entender por qué realmente lo agradecería.
Tabla de EventReceivers.
Id. Identificador único no 16
Nombre nvarchar no 512
Id. Del sitio identificador único no 16
WebId identificador único no 16
HostId identificador único 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
Ensamblaje nvarchar no 512
Clase nvarchar no 512
Datos 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
index_name index_description index_keys
EventReceivers_ByContextCollectionId no agrupado situado en PRIMARIO SiteID, ContextCollectionId
EventReceivers_ByContextObjectId no agrupados encuentra en PRIMARIO SiteID, ContextObjectId
EventReceivers_ById no agrupados, único situado en PRIMARIO SiteID, Id
EventReceivers_ByTarget agrupado, exclusivo situado en PRIMARIO SiteID, WebID, hostid, HOSTTYPE, Tipo, ContextCollectionId, ContextObjectId, ContextId, ContextType, ContextEventType, SequenceNumber, Assembly, Class
EventReceivers_IdUnique clave no agrupada, única, única ubicada en PRIMARY Id
proc_InsertEventReceiver
yproc_InsertContextEventReceiver
hacemos que no podemos ver en el XDL? También para reducir el paralelismo, ¿por qué no solo afectar estas declaraciones directamente (usando MAXDOP 1) en lugar de anular con configuraciones de todo el servidor?