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)

状況

マイクロソフトでは、この「対象」に記載されているマイクロソフト製品の問題として認識しています。

詳細

この問題を再現する手順


メモ 次の手順では、SQL Server 2005 を実行している 2 台のサーバーがあることを前提としています。1 つのインスタンスの名前は ServerA\SQL2005 です。その他のインスタンスの名前は ServerB\SQL2005 です。
  1. SQL Server 2005 のサーバー A のインスタンスで、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. SQL Server 2005 のサーバー B のインスタンスで、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. ServerA インスタンスの 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. SQL Server 2005 のサーバー B のインスタンスで、次のステートメントを実行します。パフォーマンスが低速であることに注意してください。
    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 - 最終更新日: 2011年8月10日 - リビジョン: 5.0
キーワード:?
kbtshoot kbprb kbexpertiseadvanced kbmt KB942982 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:942982
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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