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

Traduções deste artigo Traduções deste artigo
ID do artigo: 942982 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

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 MASTER
    GO
    IF EXISTS (SELECT * FROM sysdatabases where name = 'LinktestTarget')
    	DROP DATABASE LinktestTarget
    GO
    CREATE DATABASE LinktestTarget
    GO
    
    ALTER DATABASE LinktestTarget MODIFY FILE
    (NAME = 'LinktestTarget', SIZE = 200MB)
    GO
    ALTER 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 = @@serverName
    
    IF 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 LinktestTarget
    GO
    CREATE 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]
    GO
    SET NOCOUNT ON
    GO
    DECLARE @counter int
    SET @counter = 1
    
    WHILE @counter < 50000
    BEGIN
    	INSERT INTO T1 (c1, c2, c3) VALUES (@counter, @counter,'')
    	SET @counter = @counter + 1
    END
    GO
    UPDATE 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 A
    SET A.c2 = B.c2
    FROM LS.LinktestTarget.dbo.T1 AS A 
    	JOIN @t2 as B on B.c1 = A.c1

Propriedades

ID do artigo: 942982 - Última revisão: terça-feira, 23 de outubro de 2007 - Revisão: 1.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Palavras-chave: 
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtpt
Tradução automática
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

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com