0

これは私の問題です。リンクサーバーを定義しました。これをLINKSERVと呼びましょう。これにはLINKDBというデータベースがあります。私のサーバー ( MYSERV ) にはMYDBデータベースがあります。

以下のクエリを実行したいと思います。

SELECT *
FROM LINKSERV.LINKDB.LINKSCHEMA.LINKTABLE
    INNER JOIN MYSERV.MYDB.MYSCHEMA.MYTABLE ON MYKEYFIELD = LINKKEYFIELD

問題は、プロファイラーを見ると、LINKSERVサーバーで多数の SELECT が作成されていることがわかります。それらは次のように見えます:

SELECT * 
FROM LINKTABLE WHERE LINKKEYFIELD = @1

@1SELECT ごとに変更されるパラメーターはどこにありますか。もちろん、これは実行されていないように見えるため、望ましくありません。私は間違っている可能性がありますが、問題は JOIN での異なるサーバーの使用に関連していると思います。実際、これを回避すると、問題はなくなります。

私は正しいですか?解決策はありますか?前もって感謝します。

4

1 に答える 1

1

リモート サーバーから返される行数を制限するために使用できるフィルター ステートメントがないため、表示されるものが最適なソリューションである可能性があります。

2 つ以上のサーバーからデータを取得するクエリを実行する場合、クエリ オプティマイザーは何をすべきかを決定する必要があります。つまり、大量のデータを要求側サーバーにプルしてそこで結合を行うか、リンク サーバーにクエリの一部を何らかの方法で送信します。評価のため?フィルターと、両方のサーバーでの統計の可用性または品質に応じて、オプティマイザーは結合に対して異なる操作 (マージまたはネストされたループ) を選択する場合があります。

あなたの場合、ローカル テーブルの行数がターゲットよりも少ないと判断され、各ローカル行に対応するターゲット行が要求されます。

この動作とパフォーマンスを向上させる方法については、JOIN 句で使用した場合のリンク サーバーの動作で説明されています。

明らかな最適化は、統計を更新し、リモート テーブルから返された行をフィルター処理する WHERE ステートメントを追加することです。もう 1 つの最適化は、選択する代わりに、リモート サーバーから必要な列のみを返すことです。*

于 2013-09-06T16:07:56.107 に答える