CORRECÇÃO: Desempenho lento num servidor ligado do SQL Server 2012 quando actualiza os dados com agrupamentos diferentes no servidor remoto

BUGS #: do 190237 (Manutenção do conteúdo) VSTS: 1427743

Sintomas

Considere o seguinte cenário:

  • Um servidor ligado está configurado entre o servidor local e um servidor remoto que ambas têm instâncias de 2012 do Microsoft SQL Server.

  • O servidor local é configurado através da utilização de um agrupamento, por exemplo, um agrupamento de maiúsculas e minúsculas.

  • O servidor remoto tem um objecto que está configurado um agrupamento diferente do servidor local, tal como o agrupamento entre maiúsculas e minúsculas.

  • É estabelecida uma ligação a partir do controlador JDBC da Microsoft para o SQL Server, controlador Microsoft ODBC para SQL Server, o fornecedor SQL OLE DB ou o SQL Native Client para o servidor local.

  • O controlador executa uma consulta de actualização do Transact-SQL como uma instrução preparada que chama o procedimento de sp_prepexec armazenados no servidor local.

  • A consulta actualiza uma tabela no servidor remoto. Isto inclui um objecto de coluna que utiliza um agrupamento diferente do servidor local.

Neste cenário, poderá detectar um desempenho lento do que a execução da consulta. Se verificar o plano de execução da consulta de actualização, poderá ver que uma análise remota é efectuada no quadro do servidor remoto sem filtragem. Por conseguinte, a consulta pode efectuar muitas leituras quando verifica a tabela remota e, em seguida, obtém todas as linhas para o servidor local.

Por exemplo, a consulta é preparada no servidor local com o agrupamento de maiúsculas e minúsculas predefinido e o servidor remoto tem uma tabela T1 que contenha uma coluna que estão entre maiúsculas e minúsculas. A actualização irá analisar todas as linhas do T1.
DECLARE @p1 INTEXEC sp_prepexec @p1 output, N'@P0 NVARCHAR(16), @P1 NVARCHAR(16)',
N'UPDATE RemoteServer.RemoteDatabase.dbo.T1 SET COL1=@P0 WHERE COL2=@P1',
N'a', N'a'
SELECT @p1

Causa

O problema ocorre porque a consulta de actualização preparada pesquisará a tabela remota quando o agrupamento não corresponde em ambos os servidores.

Resolução

Depois de aplicar a correcção, tem de activar o sinalizador de rastreio 4199 no servidor local que aloja o servidor ligado. Para saber como activar o traceflag, consulte a secção mais informações.

Nota A correcção só se aplica para o servidor local que hospeda o servidor ligado e optimiza as demonstrações preparadas. Esta correcção não é aplicável para o servidor remoto.

O problema foi corrigido pela primeira vez na actualização cumulativa do SQL Server.

Actualização cumulativa 6 para o SQL Server 2012 SP1/en-us/help/2874879

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:


Informações sobre correçãoExiste 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 correcção estiver disponível para transferência, existirá uma secção de "Transferência de correcçã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 Caso ocorram 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 questões de suporte adicional e problemas incluídos nesta correçã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.

Pré-requisitosPara aplicar esta correcção, tem de ter o SQL Server 2012 instalado.

Informações de registoNão tem de alterar o registo depois de aplicar esta correcção.

Informações sobre substituição da correçãoEsta correcção não substitui quaisquer outras correcções.


A correcção permite que o optimizador do SQL Server permitir que o plano de execução efectuar a filtragem remoto em que a cláusula where é empurrada para o servidor remoto para minimizar as linhas obtidas da tabela remota.

Estado

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Solução alternativa

Para trabalhar abound o problema, utilize um dos seguintes métodos:

  • Não utilize as instruções preparadas no código de origem da aplicação de cliente. Pode utilizar instruções ad hoc ou instruções pode ser chamadas como procedimentos armazenados em vez disso, se o controlador suporta as interfaces.

  • Utilize agrupamento correspondente em ambos os servidores.

Mais informações

Para activar o sinalizador de rastreio, adicione o parâmetro de arranque -T4199 ou TRACEON(4199,-1) de DBCC antes a instrução preparada é compilada para activar o comportamento.

Pode utilizar um dos seguintes métodos para activar o sinalizador de rastreamento:

  • Antes de iniciar o SQL Server, utilize o Gestor de configuração do Microsoft SQL Server, com o botão direito a instância afectada e adicione o parâmetro de arranque -T4199 , de modo a que persistir através de reinícios e todas as ligações para a instância no futuro.

  • Activar dinamicamente a definição em tempo de execução quando o serviço é iniciado e globalmente para todas as ligações "(-1)." Certifique-se de que livre a cache de procedimentos se tencionar efectuar ensaios com o parâmetro activada ou desactivada.

    Utilize o seguinte para activar a definição global e dinamicamente:
    DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
    DBCC FREEPROCCACHE
    Utilize o seguinte para desactivar a definição global e dinamicamente:
    DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
    DBCC FREEPROCCACHE


Author: jannaw; jasonh
Writer: v-shysun
Revisor técnico: jasonh; jayc; makohli; jannaw; sqlprev
Editor: v-mordew

Precisa de mais ajuda?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Quão satisfeito está com a qualidade da tradução?

O que afetou a sua experiência?

Comentários adicionais? (Opcional)

Obrigado pelos seus comentários!

×