SqlDataAdapter.fill() で sproc を実行すると、管理スタジオで同じ sproc を実行すると 1 ~ 2 秒しかかからないのに、90 秒以上かかっていることに気付きました。問題を見つけようとしてパラメータをいじり始めましたが、最終的にはそうしましたが、それは奇妙なものです。sproc で 3 つの新しい変数を単純に宣言し、パラメーターの内容をそれらに直接コピーして、sproc の本体でそれらの新しい変数を使用すると、fill() メソッドが 1 ~ 2 秒に低下することがわかりました。管理スタジオで直接sprocを実行します。言い換えれば、これを行う:
CREATE PROCEDURE [dbo].[TestProc]
@location nvarchar(100), @startTime datetime, @endTime datetime
AS
declare @location2 nvarchar(100), @endTime2 datetime, @startTime2 datetime
set @location2 = @location
set @startTime2 = @startTime
set @endTime2 = @endTime
--... query using @location2, @startTime2, @endTime2
クエリ本体の参照を 1 つでも @startTime2 から @startTime (C# から渡された実際のパラメーター) に戻すと、クエリは 90 秒前後またはそれ以上に跳ね上がりました。
SO .... なぜ、SQLDataAdapter または SQL Server は、sproc に渡された後、パラメーターを使用して何をするかを気にするのですか? これが実行時間に影響するのはなぜですか? この問題をさらに根絶する方法についてのガイダンスは大歓迎です。ありがとう!
編集: SqlDataAdapter を使用して C# からクエリを実行することと、管理スタジオを使用してクエリを実行することの間には違いがあると断言できましたが、現時点では、違いを再現することはできません。現在、パラメーターをコピーしないと、管理スタジオでも sproc を実行するのに 90 秒以上かかります。これは、問題が何らかの形で C# にあるのではなく、(まだ奇妙ではありますが) SQL Server の問題に過ぎないことを意味するため、非常に安心です。私のチームの優秀な SQL 担当者の 1 人は、最初にパラメーターをコピーした場合とコピーしない場合の sproc の実行パスを調べています。解決したら、ここに回答を投稿します。これまで助けてくれてありがとう!