Por predefinição, Service Pack 1 para o SQL Server 2014 e Service Pack 3 para SQL Server 2012 incluem esta correcção e não tem de adicionar quaisquer sinalizadores de rastreio para activar a correcção. Para activar a correcção depois de instalar uma das actualizações cumulativas contidas na secção Resolução, tem de iniciar o Microsoft SQL Server, adicionando o sinalizador de rastreio 1236 aos parâmetros de arranque.
Sintomas
Suponha que executa uma instância de Microsoft SQL Server 2014, 2012 do SQL Server, SQL Server 2008 ou SQL Server 2008 R2 num computador que contém o número de processadores. Quando o número de bloqueios (tipo de recurso = base de dados) para uma base de dados específica excede um determinado limiar, detectar os seguintes problemas de desempenho:
-
Ocorrem valores elevados para a contagem de spinlock LOCK_HASH .
Nota Consulte a secção "Mais informação" para obter informações sobre como monitorizar este spinlock. -
Consultas ou operações que necessitem de bloqueios de base de dados demoram muito tempo a ser concluída. Por exemplo, poderá detectar os atrasos de desempenho seguintes:
-
Inícios de sessão do SQL Server
-
Consultas de servidor ligado
-
sp_reset_connection
-
Transacções
-
Nota Para localizar a lista de bloqueios (tipo de recurso = base de dados) numa determinada base de dados, consulte a secção "Mais informação". O valor de limiar varia consoante o ambiente.
Resolução
Informações de actualização cumulativa
O problema foi corrigido pela primeira vez na actualização cumulativa do SQL Server.
Actualização cumulativa 13 para o SQL Server 2008 R2 SP2/en-us/help/2967540
Actualização cumulativa 17 para o SQL Server 2008 SP3/en-us/help/2958696
Actualização cumulativa 1 para o SQL Server 2014/en-us/help/2931693
Actualização cumulativa 9 para SQL Server 2012 SP1/en-us/help/2931078
Cada nova actualização cumulativa para o SQL Server contém todas as correcções e todas as correcções de segurança que foram incluídas na anterior actualização cumulativa. Verifique as actualizações cumulativas mais recentes para o SQL Server:
-
Actualização cumulativa mais recente para o SQL Server 2008 R2 SP2
-
Actualização cumulativa mais recente para o SQL Server 2008 SP3
-
Actualização cumulativa mais recente para o SQL Server SP1 de 2012
Informações sobre correção
Existe uma correção suportada pela Microsoft. No entanto, esta correção destina-se apenas a corrigir o problema descrito neste artigo. Aplique esta correcção apenas em sistemas que tenham este problema específico. Se a correção está disponível para transferência, existe uma secção de "Transferência de Correção Disponível" na parte superior deste artigo da Base de Dados de Conhecimento. Se esta secção não for apresentado, submeta um pedido de suporte e serviço de cliente Microsoft para obter a correcção. Nota Se ocorrerem problemas adicionais ou se for necessária a resolução de problemas, poderá ter de criar um pedido de assistência separado. Os custos de normais do suporte serão aplicados a perguntas de suporte adicionais e os problemas incluídos nesta correcção específica. Para uma lista completa dos números de telefone de suporte e serviço de cliente da Microsoft ou para criar um pedido de assistência separado, visite o seguinte Web site da Microsoft:http://support.microsoft.com/contactus/?ws=supportNota O formulário "Transferência de correcção disponível" apresenta os idiomas nos quais a correcção está disponível. Se não visualizar o seu idioma, é porque uma correcção não está disponível para esse idioma.
Estado
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".
Mais informações
Quando uma aplicação efectua uma ligação ao SQL Server, primeiro estabelece um contexto de base de dados. Por predefinição, a ligação irá tentar obter um bloqueio de base de dados em modo SH. O bloqueio de Base de dados SH será liberado quando a ligação está parada ou contexto de base de dados é alterado durante a duração da ligação. Se tiver muitas ligações activas que utilizem o mesmo contexto de base de dados, pode ter muitos bloqueios do tipo de recurso base de dados para essa base de dados específica.
No computador que tenha 16 ou mais CPUs, apenas os objectos tabela utilizam um esquema de bloqueio com partições. No entanto, não estão particionados os bloqueios de base de dados. Assim, quanto maior for o número de base de dados bloqueia, mais tempo que demora para o SQL Server obter um bloqueio na base de dados. A maioria das aplicações não detectar quaisquer problemas que são causados por esta estrutura. Mas, logo que o número exceder um determinado limiar, o trabalho adicional e a hora é necessária para obter o bloqueio. Embora o custo é apenas micro segundos para cada adicionais do bloqueio, o tempo total pode aumentar rapidamente, uma vez que os recipientes de hash de bloqueio estão protegidos através da utilização de um spinlock. Isto faz com que os ciclos de CPU adicionais e aguarda trabalhadores adicionais obter o bloqueio. Esta correcção introduz a base de dados de bloqueio de criação de partições quando o sinalizador de rastreio T1236 está activado no arranque. O bloqueio de base de dados de criação de partições mantém a profundidade da lista de bloqueio gerível em cada partição local. Isto optimiza significativamente o caminho de acesso que é utilizado para obter um bloqueio de base de dados . Para monitorizar o spinlock LOCK_HASH , pode utilizar a seguinte consulta.SET NOCOUNT ONCREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint, [spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] 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 END SELECT * FROM #spinlock_stats ORDER BY [CaptureTime] DROP TABLE #spinlock_stats Para mais informações sobre como diagnosticar e resolver contenção de spinlock no SQL Server, vá para o seguinte documento:Diagnosticar e resolver contenção de Spinlock no SQL ServerNota Apesar deste documento destina-se de SQL Server 2008 R2, é aplicável a 2012 do SQL Server a informação.
Referências
Para mais informações sobre sinalizadores de rastreio de 2012 do SQL Server, vá para o seguinte Web site da TechNet:
Obter informações sobre sinalizadores de rastreio no SQL Server 2012 Para mais informações sobre como localizar o número de bloqueios de base de dados no utilizador por base de dados, utilize a seguinte consulta para calcular este valor:select Resource_database_id, resource_type, request_mode, request_status, count (*) 'LockCount' from sys.dm_tran_locks group by Resource_database_id, resource_type, request_mode, request_status