El 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

Síntomas

Imagine el siguiente escenario:
  • 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, se ejecuta 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 24 segundos para finalizar.

Causa

La consulta realiza una operación de análisis remoto en la tabla del 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 tiempo en Finalizar.

Sin embargo, cuando ejecuta la consulta en SQL Server 2000, la operación de consulta remota envía la consulta para que 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 poco tiempo.

Solución alternativa

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

Por ejemplo, actualizar la instrucción DECLARE que se menciona en el paso 4 de la sección "Más informació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 que se enumeran en la sección "Aplicable a".

Más información

Pasos para reproducir este problema


Nota: Los pasos siguientes se supone que tiene dos servidores que ejecutan SQL Server 2005. Un nombre de instancia es ServerA\SQL2005. El nombre de la 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 MASTERGO
    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 del servidor b 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 siguiente instrucción para crear una tabla y, a continuación, rellene la tabla con 50.000 filas de datos:
    USE LinktestTargetGO
    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 del 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: 14 ene. 2017 - Revisión: 1

Comentarios