小さなログ処理アプリケーションから実行する単純なクエリだと思っていたものがあります。このメソッドの目的は、単純にログ テーブルから最も高い日付値を取得することです。
private DateTime GetLastEntryDate(string serverName, string siteName)
{
DateTime dt = DateTime.MinValue;
using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["LogParserDB"].ConnectionString))
{
con.Open();
using (var cmd = new SqlCommand("SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site", con))
{
cmd.CommandTimeout = 120;
cmd.Parameters.AddWithValue("Host", serverName);
cmd.Parameters.AddWithValue("Site", siteName);
var result = cmd.ExecuteScalar();
if (result != DBNull.Value)
{
dt = (DateTime)result;
}
}
}
return dt;
}
テーブルにはいくつかのインデックスがありますが、それが関連しているかどうかはわかりません。問題は、このコードを実行すると、2 分後にタイムアウトが発生することですExecuteScalar
。
そのクエリをコピーして同じパラメーターを使用して SSMS に貼り付けると、00:00:04 または 00:00:00 (統計を更新したばかりの場合) で完了します。
SELECT MAX(date) FROM iislogs WHERE host='servername' AND site='W3SVC1'
ブロッキングを確認しましたが、そのようなものは何も表示されません。そのデータベースは、この 1 つのアプリによってのみアクセスされており、マルチスレッドなどではありません。
更新: 興味深いことに、Profiler によってキャプチャされた正確なクエリを実行すると、SSMS でも時間がかかります。
exec sp_executesql N'SELECT MAX(date) FROM iislogs WHERE host=@Host AND site=@Site',N'@Host nvarchar(13),@Site nvarchar(6)',@Host=N'servername',@Site=N'W3SVC1'
実際の列はそれぞれvarchar(50)
とvarchar(10)
です。