以下の私のC#コードは、SQLデータベースをチェックして、レコードがClientIDとユーザー名に一致するかどうかを確認します。一致するレコードが15個以上見つかった場合、Windows 2008サーバーのCPUは約78%でピークに達しますが、以下のC#コードの実行中に15個のレコードが見つかります。SQL Server 2008のデータベースとソフトウェアは別のサーバーにあるため、SQLServerがCPUをスパイクすることで問題が発生することはありません。問題は、以下のコードを実行している私のC#ソフトウェアにあります。データベースクエリが実行され、レコードが検出されている間、以下のC#コードを含むソフトウェア実行可能ファイルが78%に急上昇していることがわかります。
15個以上の一致するレコードが見つかったときにCPUが急上昇する原因となっているコードに問題があるかどうか、誰かに教えてもらえますか?また、コードを最適化する方法を教えてください。
更新:10個のレコードが見つかった場合、CPUは2〜3パーセントで急上昇します。15以上のレコードが見つかった場合にのみ、CPUが78%で2〜3秒間スパイクします。
//ClientID[0] will contain a ClientID of 10 characters
//output[0] will contain a User Name
char[] trimChars = { ' ' };
using (var connection = new SqlConnection(string.Format(GlobalClass.SQLConnectionString, "History")))
{
connection.Open();
using (var command = new SqlCommand())
{
command.CommandText = string.Format(@"SELECT Count(*) FROM Filelist WHERE [ToAccountName] = '" + output[0] + @"'");
command.Connection = connection;
var rows = (int) command.ExecuteScalar();
if (rows >= 0)
{
command.CommandText = string.Format(@"SELECT * FROM Filelist WHERE [ToAccountName] = '" + output[0] + @"'");
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
//Make sure ClientID does NOT exist in the ClientID field
if (reader["ClientID"].ToString().TrimEnd(trimChars).IndexOf(ClientID[0]) !=
-1)
{
//If we are here, then do something
}
}
}
reader.Close();
reader.Dispose();
}
}
// Close the connection
if (connection != null)
{
connection.Close();
}
}
}