web-dev-qa-db-ja.com

リンクサーバーXのOLE DBプロバイダー "SQLNCLI"から行セットをフェッチできません

リンクサーバーを介して同じテーブルから同時読み取りを実行すると、このエラーが発生します。タイムアウト設定は大丈夫です。このエラーが発生すると、同じクエリに対して次のエラーも発生し始めます。

「トランザクション(プロセスID X)は、別のプロセスを使用してロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行してください。」

これは、リンクサーバーを介して実行できる読み取りの数に制限があることを意味しますか?もしそうなら、限界は何ですか?それとも他の理由で起こっているのでしょうか?

また、使用されるクエリは次のとおりです。

SELECT  T.Col1, T.Col2, T.Col3, PG.Col1, PG.Col2, PG.Col3
INTO #TMP_OUTPUT 
FROM  linkedserver1.db1.dbo.table1 T WITH (NOLOCK)
      INNER JOIN #temp2 PG 
      ON T.Col1 = PG.Col1
WHERE T.Col3 = somevalue

ありがとう、カヌ

3
kanu

いいえ、これは、デッドロックしたリソースがあるために発生しています。あなたがする必要があるのは SQLトレースでデッドロック情報をキャプチャする (SQLプロファイラを使用できます)またはトレースフラグです。

これにより、デッドロックと被害者が選択される原因となった2つのセッションで競合が発生したことを示す情報(およびトレースを使用してデッドロックグラフを取得できます)が表示されます(これにより、投稿したエラーが表示されます)。

デッドロックが発生します。それらが非常にまれである場合、それはおそらく心配する問題ではありません。しかし、それらが常に発生している場合は、それらを引き起こしているクエリをドリルダウンする必要があります。必要に応じて、DMLを作り直すか、トランザクションの分離レベルを変更する必要がある場合があります(ダーティリードを許可するのは適切ではありません)、またはスナップショット分離や読み取りコミットスナップショット分離などの楽観的分離レベル。ただし、これらの楽観的な分離レベルは、tempdbをハンマーする行のバージョン管理を利用するため、ここで十分に検討する必要があります。 tempdbの構成では、パフォーマンスを完全に引き出すことができます。

6
Thomas Stringer