Por predefinição, o Service Pack 1 para SQL Server 2014 e o Service Pack 3 para SQL Server 2012 incluem esta correção e não tem de adicionar sinalizadores de rastreio para ativar a correção. Para ativar a correção depois de instalar uma das atualizações cumulativas 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 você execute uma instância do Microsoft SQL Server 2014, SQL Server 2012, SQL Server 2008 ou SQL Server 2008 R2 em um computador que contém muitos processadores. Quando o número de bloqueios (tipo de recurso = DATABASE) para um banco de dados específico excede um determinado limite, você enfrentará os seguintes problemas de desempenho:
Ocorrem valores elevados para LOCK_HASH contagem de spinlocks.
Observação Consulte a seção "Mais informações" para obter informações sobre como monitorar esse spinlock.
As consultas ou operações que requerem bloqueios de base de dados demoram muito tempo a serem concluídas. Por exemplo, poderá deparar-se com os seguintes atrasos de desempenho:
- SQL Server inícios de sessão
- Consultas do servidor ligado
- sp_reset_connection
- Transações
Observação Para localizar a lista de bloqueios (tipo de recurso = BANCO de DADOS) em um determinado banco de dados, consulte a seção "Mais informações". O valor limite varia consoante o ambiente.
Resolução
Informações de atualização cumulativa
O problema foi corrigido na atualização cumulativa seguinte do SQL Server.
Atualização Cumulativa 13 para SQL Server 2008 R2 SP2 /en-us/help/2967540
Atualização Cumulativa 17 para SQL Server 2008 SP3 /en-us/help/2958696
Atualização Cumulativa 1 para SQL Server 2014 /pt-PT/help/2931693
Atualização Cumulativa 9 para SQL Server 2012 SP1 /en-us/help/2931078
Acerca das atualizações cumulativas para SQL Server
Cada nova atualização cumulativa para SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Consulte as atualizações cumulativas mais recentes para SQL Server:
- Atualização cumulativa mais recente para o SQL Server 2008 R2 SP2
- Atualização cumulativa mais recente para o SQL Server 2008 SP3
- Atualização cumulativa mais recente para o SQL Server 2014
- Atualização cumulativa mais recente para o SQL Server 2012 SP1
Informações sobre o hotfix
Um hotfix suportado está disponível da Microsoft. No entanto, esse hotfix destina-se a corrigir apenas o problema descrito neste artigo. Aplique esse hotfix somente para sistemas que estão enfrentando esse problema específico.
Se o hotfix estiver disponível para download, há uma seção "Download de Hotfix Disponível" na parte superior deste artigo da Base de Dados de Conhecimento. Se esta seção não for exibida, envie uma solicitação para o Suporte e Atendimento ao Cliente Microsoft para obter o hotfix.
Observação Se ocorrerem problemas adicionais ou se for necessária alguma solução de problemas, talvez seja necessário criar uma solicitação de serviço separada. Os custos normais de suporte serão aplicados a problemas e questões de suporte adicionais que não se qualificam para esse hotfix específico. Para obter uma lista completa dos números de telefone do Suporte e Atendimento ao Cliente da Microsoft ou para criar um pedido de serviço separado, visite o seguinte site da Microsoft:
/contactus/?ws=support Observação O formulário "Download de Hotfix Disponível" exibe os idiomas para os quais o hotfix está disponível. Se não vir o seu idioma, é porque não está disponível uma correção para esse idioma.
Estado
A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".
Mais Informações
Quando um aplicativo faz uma conexão com SQL Server, ele primeiro estabelece um contexto de banco de dados. Por predefinição, a ligação tentará obter um bloqueio de DATABASE no modo SH. O bloqueio SH-DATABASE será liberado quando a conexão for interrompida ou o contexto do banco de dados for alterado durante a vida útil da conexão. Se tiver muitas ligações ativas que utilizam o mesmo contexto de base de dados, pode ter muitos bloqueios do tipo de recurso DATABASE para essa base de dados específica.
No computador com 16 ou mais CPUs, apenas os objetos de tabela usam um esquema de bloqueio particionado. No entanto, os bloqueios de banco de dados não são particionados. Portanto, quanto maior o número de bloqueios de banco de dados, mais tempo leva para SQL Server obter um bloqueio no banco de dados. A maioria das aplicações não deteta quaisquer problemas causados por esta estrutura. Mas assim que o número exceder um determinado limite, é necessário trabalho e tempo adicionais para obter o bloqueio. Embora o custo seja de apenas micro segundos para cada bloqueio adicional, o tempo total pode aumentar rapidamente porque os buckets de hash de bloqueio são protegidos usando um spinlock. Isto provoca ciclos adicionais de CPU e aguarda que os trabalhadores adicionais obtenham o bloqueio.
Esse hotfix introduz o particionamento de bloqueio de banco de dados quando o sinalizador de rastreamento T1236 está habilitado na inicialização. Particionar o bloqueio DATABASE mantém a profundidade da lista de bloqueios gerenciável em cada partição local. Isso otimiza significativamente o caminho de acesso usado para obter um bloqueio de BANCO de DADOS.
Para monitorar o LOCK_HASH spinlock, você pode usar a consulta a seguir. DEFINIR NOCOUNT ON
CREATE TABLE #spinlock_stats([CaptureTime] datetime,[name] nvarchar(512),[collisions] bigint,
[Spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARAR @counter int = 1
ENQUANTO 100 @counter<
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() as "CaptureTime" , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
AGUARDE O ATRASO '00:00:05'
DEFINIR @counter +=1
End
SELECIONAR * DE #spinlock_stats ORDENAR POR [CaptureTime]
DROP TABLE #spinlock_stats Para obter mais informações sobre como diagnosticar e resolver a contenção de spinlock em SQL Server, vá para o seguinte documento:
Diagnóstico e Resolução de Contenção de Spinlock em SQL Server Nota Embora este documento tenha sido escrito para SQL Server 2008 R2, as informações ainda são aplicáveis a SQL Server 2012.
Referências
Para obter mais informações sobre sinalizadores de rastreamento no SQL Server 2012, vá para o seguinte site da TechNet:
Informações sobre sinalizadores de rastreio no SQL Server 2012
Para obter mais informações sobre como encontrar o número de bloqueios de banco de dados em usuário por banco de dados, use a seguinte consulta para calcular esse valor:selecione Resource_database_id, resource_type, request_mode, request_status,
contagem (*) 'LockCount' de sys.dm_tran_locks
Agrupar por Resource_database_id, resource_type, request_mode request_status