在更新連結的伺服器上的表格,然後將資料表聯結到本機伺服器上的表格的 SQL Server 2005 中執行查詢時,效能變慢

文章翻譯 文章翻譯
文章編號: 942982 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

考慮下列案例:
  • 您必須更新連結的伺服器上的表格,然後將資料表聯結到本機伺服器上的表格的查詢。
  • 本機伺服器正在執行 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 中執行查詢時遠端查詢作業送出查詢以連結的伺服器上執行。因此,即使該資料表包含許多資料列,遠端掃描作業已在短時間內完成。

其他可行方案

如果要解決這個問題,新增本機伺服器上資料表中的 [UNIQUE 條件約束或 PRIMARY KEY 條件約束]。您要用於 JOIN 操作的欄中加入條件約束。

在下列的步驟 4 的 < 其他相關資訊 > 一節所描述的 DECLARE 陳述式的更新,例如:
DECLARE @t2 table (c1 int primary key, c2 int)

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。

其他相關資訊

如果要重現這個問題的步驟


附註下列步驟假設您有兩部執行 SQL Server 2005 的伺服器。一個執行個體名稱是 ServerA\SQL2005。其他執行個體名稱是 ServerB\SQL2005。
  1. 在 SQL Server 2005 ServerA 執行個體上, 執行下列陳述式建立的資料庫中 SQL Server 管理 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. 在 SQL Server 2005 ServerB 執行個體上, 執行下列陳述式在管理 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 ServerA 執行個體上, 執行下列陳述式來建立一個資料表,並再填入 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. 在 SQL Server 2005 ServerB 執行個體上, 執行下列陳述式。請注意效能變慢
    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 - 上次校閱: 2007年10月23日 - 版次: 1.1
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
關鍵字:?
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:942982
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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