当在 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 约束或主键约束。将约束添加到用于 JOIN 操作的列。

例如对于您更新 DECLARE 语句与以下的步骤 4 中的在"更多信息"部分中提到的:
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 上实例上运行以下语句,在管理 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 上实例上运行下列语句。请注意,性能越慢
    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 2005 Server Workgroup
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
关键字:?
kbmt kbexpertiseadvanced kbtshoot kbprb KB942982 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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