Rendimiento es lento cuando ejecuta una consulta en SQL Server 2005 que actualiza una tabla en un servidor vinculado y, a continuación, combina la tabla a una tabla en el servidor local

Seleccione idioma Seleccione idioma
Id. de artículo: 942982 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Tenga en cuenta la situación siguiente:
  • Tiene una consulta que actualiza una tabla en un servidor vinculado y, a continuación, combina la tabla a una tabla en el servidor local.
  • El servidor local está ejecutando Microsoft SQL Server 2005.
  • En el servidor local, ejecutar la consulta en SQL Server 2005.
En este escenario, rendimiento es lento en comparación con el rendimiento de la misma consulta en Microsoft SQL Server 2000. Por ejemplo, cuando ejecuta la consulta en SQL Server 2000, la consulta tarda menos de 1 segundo para finalizar. Sin embargo, cuando ejecuta la consulta en SQL Server 2005, la consulta tarda unos segundos 24 para finalizar.

Causa

La consulta realiza una operación de análisis remoto en la tabla en el servidor vinculado. Cuando ejecuta la consulta en SQL Server 2005, la operación de análisis remoto recupera todas las filas de la tabla. Si la tabla contiene muchas filas, la operación de análisis remoto tarda mucho para finalizar.

Sin embargo, cuando ejecuta la consulta en SQL Server 2000, la operación de consulta remota envía la consulta se ejecute en el servidor vinculado. Por lo tanto, incluso si la tabla contiene muchas filas, la operación de análisis remoto es completa en un breve período de tiempo.

Solución

Para evitar este problema, agregue una restricción UNIQUE o PRIMARY KEY de la tabla en el servidor local. Agregar la restricción a la columna que se utiliza para la operación JOIN.

Por ejemplo, actualizar la instrucción DECLARE que se menciona en el paso 4 de "más información" de la sección a la siguiente:
DECLARE @t2 table (c1 int primary key, c2 int)

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:".

Más información

Pasos para reproducir este problema


Nota Los siguientes pasos se supone que tiene dos servidores que ejecutan SQL Server 2005. Un nombre de instancia es ServerA\SQL2005. El otro nombre de instancia es ServerB\SQL2005.
  1. En la instancia de servidor de SQL Server 2005, ejecute las instrucciones siguientes para crear una base de datos en 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. En la instancia ServerB de SQL Server 2005, ejecute las instrucciones siguientes para crear un servidor vinculado en 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. En la instancia de servidor de SQL Server 2005, ejecute la instrucción siguiente para crear una tabla y, a continuación, llenar la tabla con 50.000 filas de datos:
    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. En la instancia de servidor b de SQL Server 2005, ejecute las instrucciones siguientes. Observe que el rendimiento es 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

Propiedades

Id. de artículo: 942982 - Última revisión: martes, 23 de octubre de 2007 - Versión: 1.1
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 942982

Enviar comentarios

 

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