現象
次のような状況を考えます。
-
リンク サーバーがローカル サーバーとリモート サーバーが Microsoft SQL Server 2012 インスタンスがある両方の間で構成されます。
-
ローカル サーバーを構成するには、区別しない照合順序など、1 つの照合順序を使用します。
-
リモート サーバーでは、大文字小文字を区別の照合順序など、ローカル サーバーから別の照合順序で構成されているオブジェクトがあります。
-
接続が確立 Microsoft JDBC ドライバーからの SQL Server では、Microsoft ODBC ドライバーは、SQL Server、SQL OLE DB プロバイダー、または SQL のネイティブ クライアントをローカル サーバーにします。
-
ドライバーは、ローカル サーバー上のsp_prepexecストアド プロシージャの呼び出しを準備されたステートメントとして Transact SQL の更新クエリを実行します。
-
クエリは、リモート サーバー上のテーブルを更新します。これには、ローカル サーバーから別の照合順序を使用している column オブジェクトが含まれます。
このシナリオでは、クエリの実行によるパフォーマンスの低下が発生する可能性があります。更新クエリの実行プランを確認する場合は、フィルターなしでリモート サーバーのテーブルにリモート スキャンを実行するを参照してください可能性があります。したがって、実行した場合多くの読み取り、リモート ・ テーブルをスキャンし、ローカル サーバーへのすべての行を取得し、そのときです。
たとえば、されない照合順序の既定値を持つローカル サーバーにクエリを準備し、リモート サーバーには、テーブルT1は、大文字小文字を区別する列が含まれる。更新プログラムでは、 T1のすべての行をスキャンします。
DECLARE @p1 INTEXEC sp_prepexec @p1 output, N'@P0 NVARCHAR(16), @P1 NVARCHAR(16)',
N'UPDATE RemoteServer.RemoteDatabase.dbo.T1 SET COL1=@P0 WHERE COL2=@P1',
N'a', N'a'
SELECT @p1
原因
問題は、両方のサーバーの照合順序が一致しない場合に更新の準備されたクエリが、リモート ・ テーブルをスキャンするために発生します。
解決策
修正プログラムを適用した後は、リンク サーバーをホストしているローカル サーバー上の 4199 のトレース フラグを有効にする必要があります。トレース フラグを有効にする方法の詳細についてを参照してください。
注 修正プログラムは、リンク サーバーをホストし、準備されたステートメントを最適化するローカル サーバーにのみ適用されます。この修正プログラムは、リモート サーバーには適用されません。
問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
SQL Server 2012 SP1 用の累積的な更新 6/en-us/help/2874879
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていた、すべての修正プログラムおよびすべてのセキュリティ更新プログラムが含まれています。以下で、SQL Server 用の最新の累積的な更新プログラムを確認してください。
修正プログラムの情報サポートされている修正プログラムは、マイクロソフトから入手可能です。ただし、この修正プログラムは、ここで説明する問題のみを修正することを目的としたものです。この問題が発生しているシステムにのみ適用してください。
修正プログラムをダウンロードできる場合は、このサポート技術情報の資料の上部に「修正プログラムのダウンロード」セクションがあります。このセクションが表示されていない場合は、マイクロソフト カスタマー サービス サポートにリクエストを送信し、修正プログラムを入手してください。