web-dev-qa-db-ja.com

リンクサーバークエリはどこで実行されますか?

2つのインスタンスServerAServerBがあり、ServerAServerBfor Linksrv_Bの場合.

ServerAで4つの部分の命名規則を使用してクエリを実行できます。

_SELECT * FROM Linksrv_B.master.sys.databases
_

またはOPENQUERY()

_SELECT * FROM OPENQUERY(Linksrv_B, 'SELECT * FROM master.sys.databases')  
_

リンクサーバーは、分散トランザクションを行セットとして使用して、異種データベース間で動作することを知っています。

  1. OLEDBプロバイダーはどこで開始/接続されますか? ServerAまたはServerB?
  2. クエリはServerAまたはServerBのどこで実行されますか?オプティマイザは、どのサーバーで実行されるのですか?
  3. 結果セットはどこにキャッシュされますか?
  4. リンクされたサーバーがどのように機能するかについて、詳しい説明を誰かに教えてもらえますか?.
7
info.sqldba

1-OLEDBプロバイダーはサーバーAで開始され、サーバーBはそれを通常の接続とクエリとして認識します。サーバーAがSQLサーバーであることを認識しておらず、単なるクライアントです。

2-クエリは両方で実行されます。サーバーAはそれを実行するサーバーBにクエリを渡し、サーバーAは結果を処理します。オプティマイザは両方で機能しますが、他のサーバーと通信できません。

複雑さのないクエリを指定すると、パフォーマンスは同等になります。ただし、複雑なクエリや大きなデータセットに取り掛かると、必要なものだけをサーバーBから一時テーブルにフェッチし、それをサーバーAに含まれるデータで使用することで、パフォーマンスが向上します。サーバー間でデータを照合します)。基本的に、OPENQUERY構文では、クエリ全体をサーバーB(where句を含めることをお勧めします)に渡し、サーバーBにデータを返します。4つの部分からなる名前を付けると、制御できなくなり、オプティマイザはすぐにテーブル内のすべてのデータをサーバーBからフェッチし、他の基準(結合、場所など)に基づいて削除します。

3-結果はキャッシュされません(SQLがデータを正常にキャッシュする場合を除く)。リンクサーバークエリの結果を一時テーブルのどこかに保存しない限り。

4-アプリケーションがデータベースに接続してクエリを実行する方法に精通している場合、プロセスは非常に似ています。認証の違いを除いて、それは同じですが、複数のサーバーからのデータを単一の結果セットに簡単に混合および照合することができます。ただし、パフォーマンスは、サーバーBからプルされるデータの量に大きく依存し、オプティマイザーがサーバーBからテーブル全体をプルするのを防ぐためのオプティマイザの制限された機能に常に注意を払っています。

4
Jonathan Fite