Desempenho é lento quando executar uma consulta no SQL Server 2005 que actualiza uma tabela num servidor ligado e, em seguida, aderir a tabela a uma tabela no servidor local

Traduções de Artigos Traduções de Artigos
Artigo: 942982 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Considere o seguinte cenário:
  • Tem uma consulta que actualiza uma tabela num servidor ligado e, em seguida, adere a tabela a uma tabela no servidor local.
  • O servidor local tem o Microsoft SQL Server 2005.
  • No servidor local, execute a consulta no SQL Server 2005.
Neste cenário, desempenho é lento em comparação com o desempenho da mesma consulta no Microsoft SQL Server 2000. Por exemplo, quando executar a consulta no SQL Server 2000, a consulta tem menos de 1 segundo para concluir. No entanto, quando executa a consulta no SQL Server 2005, a consulta demora cerca de 24 segundos para concluir.

Causa

A consulta efectua uma operação verificação remota de mensagens em fila na tabela no servidor ligado. Quando executar a consulta no SQL Server 2005, a operação de verificação remoto obtém todas as linhas na tabela. Se a tabela contiver várias linhas, a operação de verificação remoto demora muito tempo para concluir.

No entanto, quando executa a consulta no SQL Server 2000, a operação de consulta remoto envia a consulta para executar no servidor ligado. Assim, mesmo se a tabela contiver várias linhas, a operação de verificação remoto é concluída num curto período de tempo.

Como contornar

Para contornar este problema, adicione uma restrição de UNIQUE ou uma restrição PRIMARY KEY na tabela no servidor local. Adicione a restrição à coluna que utiliza para a operação JOIN.

Por exemplo, actualizar a instrução DECLARE mencionada na secção passo 4 do "mais informação" para o seguinte:
DECLARE @t2 table (c1 int primary key, c2 int)

Ponto Da Situação

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

Mais Informação

Passos para reproduzir este problema


Nota Os seguintes passos suponha que tem dois servidores com o SQL Server 2005. Um nome de instância é ServerA\SQL2005. O outro nome de instância é ServerB\SQL2005.
  1. Na instância servidora do SQL Server 2005, execute as instruções seguintes para criar uma base 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 ServerB do SQL Server 2005, execute as instruções seguintes para criar um servidor ligado 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 servidora 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 ServerB do SQL Server 2005, execute as instruções seguintes. Repare que o desempenho é 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

Artigo: 942982 - Última revisão: 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 2005 Server Workgroup
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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