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 経由で接続する場合にのみ問題が発生するようです。