1

SQL Server 2000 と 2 つのリンク サーバーを使用しているときに奇妙な問題が発生しました。2 年間、私たちのソリューションは滞りなく実行されてきましたが、昨日突然、あるデータベースから別のデータベースにデータを同期するクエリがタイムアウトし始めました。

データが必要な注文を含むサーバーにリンクされている生産ネットワークのサーバーに接続します。

クエリにはいくつかの結合が含まれていますが、基本的にこれは何が行われたかを要約したものです:

INSERT INTO ProductionDataCache
   (column1, column2, ...)
   SELECT tab1.column1, tab1.column2, tab2.column1, tab3.column1 ...
       FROM linkedserver.database.dbo.Table1 AS tab1
       JOIN linkedserver.database.dbo.Table2 AS tab2 ON (...)
       JOIN linkedserver.database.dbo.Tabl32 AS tab3 ON (...)
       ...
       WHERE tab1.productionOrderId = @id
       ORDER BY ...

明らかに、問題を解決するための最初の試みは、タイムアウト制限を元の 5 分から増やすことでした。しかし、30分に到着してもタイムアウトが発生したとき、何か他のことが起こっているのではないかと疑い始めました. クエリの実行時間が 5 分未満から一晩で 30 分以上になることはありません。

SQL クエリ (元は C# コードでした) をログに出力し、クエリ アナライザーでデータベース サーバー上で直接クエリを実行することにしました。驚いたことに、クエリは 10 秒もかからずに正しく実行されました。

そのため、単純なテスト プログラムで SQL の実行を分離し、このソリューションを最初に実行したサーバーと、データベース サーバーでローカルに実行したときの両方で、同じクエリ タイムアウトを観察しました。また、ストアド プロシージャを作成してプログラムから実行しようとしましたが、これもタイムアウトします。Query Analyzer で実行すると、数秒もかからずに正常に動作します。

この問題は、C# プログラムからこのクエリを実行した場合にのみ発生するようです。以前にそのような動作を見て、その解決策を見つけた人はいますか?

更新: サーバーで SQL プロファイラーを使用しました。明らかな違いは、.NET プログラムからクエリを実行すると、"exec sp_executesql N'INSERT INTO ...'" としてログに表示されますが、クエリ アナライザーから実行すると、通常のクエリとしてログに記録されることです。 .

さらに、プログラムと同じ SQL ユーザーを使用して SQL Query Analyzer に接続しようとしましたが、これが Query Analyzer でも問題を引き起こしました。そのため、sql ユーザーを使用して TCP/IP 経由で接続する場合にのみ問題が発生するようです。

4

1 に答える 1

0

調査すべき点がいくつかあります。最初はSETオプションです。これらは、一部のクエリに大きな違いをもたらす可能性があります。トレースのSETオプションを確認し、Management Studio (またはクエリ アナライザー) でテストするときにこれらを繰り返します。これらを実際に確認するには、実際のプロファイル セッションを確認する必要があることに注意してください (コードがログに記録するものだけではありません)。

次に注目するのはトランザクションです。C# で使用しているトランザクション モデルは何ですか? どれでも?なし?何の隔離?シリアライズ可能?もしかして配布?テーブルに不明瞭なロックが保持されている可能性があります。

もちろん、ロックが問題である場合は、クエリの実行中にsp_who/を介して何かが表示されることがあります。sp_who2

于 2010-01-19T19:31:41.073 に答える