現在オフラインです。再接続するためにインターネットの接続を待っています

SQL Server 2005、リンク サーバー上のテーブルを更新し、ローカル サーバー上のテーブルにテーブルを結合するクエリを実行するとパフォーマンスが遅い

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB: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)
状況
マイクロソフトでは、この「対象」に記載されているマイクロソフト製品の問題として認識しています。
詳細

この問題を再現する手順


メモ 次の手順では、SQL Server 2005 を実行している 2 台のサーバーがあることを前提としています。1 つのインスタンスの名前は ServerA\SQL2005 です。その他のインスタンスの名前は ServerB\SQL2005 です。
  1. SQL Server 2005 のサーバー A のインスタンスで、SQL Server Management 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 のサーバー B のインスタンスで、Management 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. ServerA インスタンスの SQL Server 2005 は、テーブルを作成するのには、次のステートメントを実行し、テーブルに 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 のサーバー B のインスタンスで、次のステートメントを実行します。パフォーマンスが低速であることに注意してください。
    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

警告: この記事は自動翻訳されています

プロパティ

文書番号:942982 - 最終更新日: 08/10/2011 12:17:00 - リビジョン: 5.0

  • kbtshoot kbprb kbexpertiseadvanced kbmt KB942982 KbMtja
フィードバック
/html>html>">