De forma predeterminada, Service Pack 1 para SQL Server 2014 y Service Pack 3 para SQL Server 2012 incluyen esta corrección y no es necesario agregar ninguna marca de seguimiento para habilitarla. Para habilitar la corrección después de instalar una de las actualizaciones acumulativas de la sección Resolución, debe iniciar Microsoft SQL Server agregando la marca de seguimiento 1236 a los parámetros de inicio.
Síntomas
Supongamos que ejecuta una instancia de Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 o SQL Server 2008 R2 en un equipo que contiene muchos procesadores. Cuando el número de bloqueos (tipo de recurso = BASE DE DATOS) de una base de datos específica supera un umbral determinado, experimenta los siguientes problemas de rendimiento:
Se producen valores elevados para LOCK_HASH recuento de bloqueos por subproceso.
Nota Consulte la sección "Más información" para obtener información acerca de cómo supervisar este bloqueo por subproceso.
Las consultas u operaciones que requieren bloqueos de base de datos tardan mucho tiempo en completarse. Por ejemplo, es posible que observe los siguientes retrasos en el rendimiento:
- Inicios de sesión de SQL Server
- Consultas de servidor vinculado
- sp_reset_connection
- de almacenamiento
Nota: Para buscar la lista de bloqueos (tipo de recurso = DATABASE) en una base de datos determinada, consulte la sección "Más información". El valor del umbral varía según el entorno.
Resolución
Información sobre la actualización acumulativa
Este problema se corrigió por primera vez en la siguiente actualización acumulativa de SQL Server.
Actualización acumulativa 13 para SQL Server 2008 R2 SP2 /en-us/help/2967540
Actualización acumulativa 38 para SQL Server 2008 SP3 /en-us/help/2958696
Actualización acumulativa 1 para SQL Server 2014 /en-us/help/2931693
Actualización acumulativa 9 para SQL Server 2012 SP1 /en-us/help/2931078
Acerca de las actualizaciones acumulativas para SQL Server
Cada nueva actualización acumulativa para SQL Server contiene todas las revisiones y correcciones de seguridad que se incluyeron con la actualización acumulativa anterior. Consulte las actualizaciones acumulativas más recientes para SQL Server:
- Actualización acumulativa más reciente para SQL Server 2008 R2 SP2
- Actualización acumulativa más reciente para SQL Server 2008 SP3
- Actualización acumulativa más reciente para SQL Server 2014
- Actualización acumulativa más reciente para SQL Server 2012 SP1
Información de la revisión
Microsoft ofrece una revisión compatible. Sin embargo, esta revisión está pensada para corregir únicamente el problema que se describe en este artículo. Aplique esta revisión únicamente a los sistemas que experimenten este problema específico.
Si la revisión está disponible para su descarga, hay una sección "Descarga de revisión disponible" en la parte superior de este artículo de Knowledge Base. Si esta sección no aparece, envíe una solicitud al soporte técnico y al servicio al cliente de Microsoft para obtener la revisión.
Nota: Si se producen más problemas o necesita alguna solución, es posible que tenga que crear una solicitud de servicio independiente. Se aplicarán los costos habituales de soporte técnico a las preguntas y problemas de soporte técnico adicionales que no estén relacionados con esta revisión específica. Para obtener una lista completa de los números de teléfono del servicio de soporte técnico y de atención al cliente de Microsoft, así como información acerca de cómo crear una solicitud de servicio independiente, visite el siguiente sitio web de Microsoft:
/contactus/?ws=support Nota: El formulario "Descarga de revisiones disponible" muestra los idiomas para los que está disponible la revisión. Si no ve su idioma, se debe a que no hay una revisión disponible para ese idioma.
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".
Más información
Cuando una aplicación establece una conexión a SQL Server, primero establece un contexto de base de datos. De forma predeterminada, la conexión intentará obtener un bloqueo de base de datos en modo SH. El bloqueo SH-DATABASE se liberará cuando se detenga la conexión o se cambie el contexto de la base de datos durante la duración de la conexión. Si tiene muchas conexiones activas que utilizan el mismo contexto de base de datos, puede tener muchos bloqueos del tipo de recurso BASE DE DATOS para esa base de datos específica.
En el equipo con 16 CPU o más, sólo los objetos de tabla utilizan un esquema de bloqueo con particiones. Sin embargo, los bloqueos de base de datos no tienen particiones. Por consiguiente, cuanto mayor sea el número de bloqueos de base de datos, más tiempo tardará SQL Server en obtener un bloqueo sobre la base de datos. La mayoría de las aplicaciones no experimentan ningún problema causado por este diseño. Pero tan pronto como el número supera un cierto umbral, se requiere trabajo y tiempo adicionales para obtener el bloqueo. Aunque el costo es de solo microsegundos por cada bloqueo adicional, el tiempo total puede aumentar rápidamente porque los cubos hash del bloqueo están protegidos mediante un bloqueo por subproceso. Esto provoca ciclos de CPU adicionales y esperas para que más trabajadores obtengan el bloqueo.
Esta revisión introduce la partición de bloqueos BASE DE DATOS cuando la marca de seguimiento T1236 está habilitada en el inicio. La creación de particiones en el bloqueo BASE DE DATOS permite administrar la profundidad de la lista de bloqueos en cada partición local. Esto optimiza significativamente la ruta de acceso que se utiliza para obtener un bloqueo de base de datos.
Para supervisar el bloqueo por subproceso LOCK_HASH, puede usar la siguiente consulta. SET NOCOUNT ON
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[gira] bigint,[spins_per_collision] real,[sleep_time] bigint,[retrocede] int)
DECLARE @counter int = 1
WHILE @counter< 100
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
WAITFOR DELAY '00:00:05'
SET @counter +=1
FIN
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats Para obtener más información acerca de cómo diagnosticar y resolver la contención de bloqueos por subproceso en SQL Server, vaya al siguiente documento:
Diagnosticar y resolver la contención de bloqueos por subproceso en SQL Server Nota Aunque este documento se escribió para SQL Server 2008 R2, la información sigue siendo aplicable a SQL Server 2012.
Referencias
Para obtener más información acerca de las marcas de seguimiento en SQL Server 2012, visite el siguiente sitio web de TechNet:
Información acerca de las marcas de seguimiento en SQL Server 2012
Para obtener más información acerca de cómo encontrar el número de bloqueos de base de datos en usuario por base de datos, use la consulta siguiente para calcular este valor:seleccione Resource_database_id, resource_type, request_mode, request_status,
count (*) 'LockCount' from sys.dm_tran_locks
Agrupar por Resource_database_id, resource_type, request_mode request_status