Производительность является медленным, при выполнении запроса в SQL Server 2005, обновляет таблицу на связанном сервере и затем соединяет таблицы в таблицу на локальном сервере

Переводы статьи Переводы статьи
Код статьи: 942982 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Проблема

Рассмотрим описанную ниже ситуацию.:
  • Имеется запрос, который обновляет таблицу на связанном сервере и затем соединяет таблицы в таблицу на локальном сервере.
  • Локальный сервер работает под управлением Microsoft SQL Server 2005.
  • На локальном сервере выполните запрос в SQL Server 2005.
В этом случае производительность является медленным по сравнению с производительностью одного и того же запроса в Microsoft SQL Server 2000. Например при выполнении запроса в SQL Server 2000 запроса занимает меньше 1 секунды до конца. Тем не менее при выполнении запроса в SQL Server 2005, запрос занимает около 24 секунд для завершения.

Причина

Запрос выполняет операцию удаленного сканирования в таблице на связанном сервере. При выполнении запроса в SQL Server 2005 операции удаленного сканирования извлекает все строки в таблице. Если таблица содержит много строк, операции удаленного сканирования занимает много времени.

Тем не менее при выполнении запроса в SQL Server 2000, операция Remote Query отправляет запрос на связанном сервере. Таким образом даже если таблица содержит много строк, операции удаленного сканирования будет завершена за короткое время.

Временное решение

Чтобы обойти эту проблему, добавьте ограничения UNIQUE или ограничений PRIMARY KEY в таблицу на локальном сервере. Добавьте ограничение для столбца, который используется для операции JOIN.

Например обновления инструкции DECLARE, описанного в действии 4 раздела "Дополнительные сведения" следующее:
DECLARE @t2 table (c1 int primary key, c2 int)

Статус

Корпорация Майкрософт подтверждает, что это проблема в продуктах Майкрософт, перечисленных в разделе «Применяется к»..

Дополнительная информация

Действия по воспроизведению проблемы


Примечание.Следующие действия предполагают наличие двух серверов, работающих под управлением SQL Server 2005. Один экземпляр называется ServerA\SQL2005. Имя экземпляра является ServerB\SQL2005.
  1. Сервер_а экземпляра SQL Server 2005 выполните следующие инструкции для создания базы данных в 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. ServerB экземпляра SQL Server 2005 выполните следующие инструкции для создания связанного сервера в среде 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. Сервер_а экземпляра SQL Server 2005 выполните следующую инструкцию, чтобы создать таблицу и заполнить таблицу с 50 000 строк данных:
    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. ServerB экземпляра SQL Server 2005 выполните следующие инструкции. Обратите внимание, что производительность медленно.
    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

Свойства

Код статьи: 942982 - Последний отзыв: 28 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Ключевые слова: 
kbexpertiseadvanced kbtshoot kbprb kbmt KB942982 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:942982

Отправить отзыв

 

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