Desempenho estiver lento quando você executa uma consulta no SQL Server 2005 que atualiza uma tabela em um servidor vinculado e associa a tabela a uma tabela no servidor local

Extended support for SQL Server 2005 ended on April 12, 2016

If you are still running SQL Server 2005, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 942982
Sintomas
Considere o seguinte cenário:
  • Você tem uma consulta que atualiza uma tabela em um servidor vinculado e associa a tabela a uma tabela no servidor local.
  • O servidor local está executando o Microsoft SQL Server 2005.
  • No servidor local, você executa a consulta no SQL Server 2005.
Nesse cenário, desempenho é lento em comparação com o desempenho da mesma consulta no Microsoft SQL Server 2000. Por exemplo, quando você executa a consulta no SQL Server 2000, a consulta leva menos de 1 segundo para terminar. No entanto, quando você executa a consulta no SQL Server 2005, a consulta leva aproximadamente 24 segundos para concluir.
Causa
A consulta executa uma operação verificação remota na tabela no servidor vinculado. Quando você executa a consulta no SQL Server 2005, a operação de verificação remota recupera todas as linhas na tabela. Se a tabela contém muitas linhas, a operação de verificação remota demora muito para terminar.

No entanto, quando você executa a consulta no SQL Server 2000, a operação de consulta remota envia a consulta para executar no servidor vinculado. Portanto, mesmo se a tabela contém muitas linhas, a operação de verificação remota é concluída em um curto período de tempo.
Como Contornar
Para contornar este problema, adicione uma restrição UNIQUE ou PRIMARY KEY na tabela no servidor local. Adicione a restrição à coluna que você usar para a operação JOIN.

Por exemplo, você atualizar a instrução DECLARE mencionada na seção Etapa 4 da "mais informação" para o seguinte:
DECLARE @t2 table (c1 int primary key, c2 int)
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".
Mais Informações

Etapas para reproduzir esse problema


Observação Os seguintes passos consideram que você tiver dois servidores que estejam executando o SQL Server 2005. Um nome de instância é ServerA\SQL2005. O outro nome de instância é ServerB\SQL2005.
  1. Na instância do servidor do SQL Server 2005, execute as seguintes instruções para criar um banco de dados no SQL Server Management Studio:
    USE MASTERGOIF EXISTS (SELECT * FROM sysdatabases where name = 'LinktestTarget')	DROP DATABASE LinktestTargetGOCREATE DATABASE LinktestTargetGOALTER DATABASE LinktestTarget MODIFY FILE(NAME = 'LinktestTarget', SIZE = 200MB)GOALTER DATABASE LinktestTarget MODIFY FILE(NAME = 'LinktestTarget_log', SIZE = 100MB)GO
  2. Na instância do ServerB do SQL Server 2005, execute as seguintes instruções para criar um servidor vinculado no Management Studio:
    DECLARE @serverName nvarchar(50)SET @serverName = @@serverNameIF EXISTS (SELECT * FROM master..sysservers WHERE srvname = 'LS')	EXEC master.dbo.sp_dropserver @server=N'LS', @droplogins='droplogins'EXEC sp_addlinkedserver    @server = N'LS',    @srvproduct = N'SQLDB',    @provider = N'SQLOLEDB',    @datasrc = N'ServerA\SQL2005',    @catalog = N'LinktestTarget'EXEC sp_serveroption N'LS', N'data access', N'true'EXEC sp_serveroption N'LS', N'rpc out', N'true'EXEC sp_serveroption N'LS', N'rpc', N'true'EXEC sp_serveroption N'LS', N'use remote collation', N'true'EXEC sp_addlinkedsrvlogin  @rmtsrvname = N'LS',  @useself = N'true',  @locallogin = N'sa'
  3. Na instância do servidor do SQL Server 2005, execute a seguinte instrução para criar uma tabela e, em seguida, preencher a tabela com 50.000 linhas de dados:
    USE LinktestTargetGOCREATE TABLE [T1] (	[c1] [int]  NOT NULL,	[c2] [int] NOT NULL,	[c3] char (4000) NOT NULL,	CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED ([c1])WITH FILLFACTOR = 80 ON [PRIMARY] ) ON [PRIMARY]GOSET NOCOUNT ONGODECLARE @counter intSET @counter = 1WHILE @counter < 50000BEGIN	INSERT INTO T1 (c1, c2, c3) VALUES (@counter, @counter,'')	SET @counter = @counter + 1ENDGOUPDATE STATISTICS T1 (PK_t1) WITH FULLSCAN
  4. Na instância do ServerB do SQL Server 2005, execute as seguintes instruções. Observe que o desempenho fica lento.
    DECLARE @t2 table (c1 int, c2 int)INSERT INTO @t2 (c1, c2) VALUES (399990, 399990) UPDATE ASET A.c2 = B.c2FROM LS.LinktestTarget.dbo.T1 AS A 	JOIN @t2 as B on B.c1 = A.c1

Propriedades

ID do Artigo: 942982 - Última Revisão: 10/23/2007 23:07:31 - Revisão: 1.1

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition

  • kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtpt
Comentários