你目前正处于脱机状态,正在等待 Internet 重新连接

当在 SQL Server 2005 年,更新链接的服务器上的表,然后将表联接到本地服务器上运行查询时,性能较低

Extended support for SQL Server 2005 ends on April 12, 2016

If you are still running SQL Server 2005 after April 12, 2016, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 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 MASTERGOIF EXISTS (SELECT * FROM sysdatabases where name = 'LinktestTarget')	DROP DATABASE LinktestTargetGOCREATE DATABASE LinktestTargetGOALTER DATABASE LinktestTarget MODIFY FILE(NAME = 'LinktestTarget', SIZE = 200MB)GOALTER DATABASE LinktestTarget MODIFY FILE(NAME = 'LinktestTarget_log', SIZE = 100MB)GO
  2. SQL Server 2005 上实例上运行以下语句,在管理 Studio 创建链接的服务器:
    DECLARE @serverName nvarchar(50)SET @serverName = @@serverNameIF 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 LinktestTargetGOCREATE 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]GOSET NOCOUNT ONGODECLARE @counter intSET @counter = 1WHILE @counter < 50000BEGIN	INSERT INTO T1 (c1, c2, c3) VALUES (@counter, @counter,'')	SET @counter = @counter + 1ENDGOUPDATE 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 ASET A.c2 = B.c2FROM LS.LinktestTarget.dbo.T1 AS A 	JOIN @t2 as B on B.c1 = A.c1

Warning: This article has been translated automatically

属性

文章 ID:942982 - 上次审阅时间:10/23/2007 23:07:31 - 修订版本: 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
反馈