SQL Management Studioを使用しているときに実行するSQLクエリが1秒未満ですが、コード実行時に30秒でデータベースサーバーから結果を取得します。結果には1700行が含まれています。 900行を返す別の同様のクエリは、実行に数ミリ秒かかります。この奇妙な行動の理由は何でしょうか?SQLクエリではクエリdbよりも多くの時間がかかります
public SqlDataReader ExecuteReader(string strSQL, ArrayList arParams)
{
OpenConnection();
SqlCommand myCommand = new SqlCommand(strSQL, myConnection);
myCommand.CommandTimeout = intTimeout;
foreach (SqlParameter myParameter in arParams)
myCommand.Parameters.Add(myParameter);
return myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
ます。strSQL:
SELECT [Group].[Id]
,[Group].[intCustomerId]
,[Group].[strName]
,[Permission].[dtmCreated]
,[Permission].[intPermissionTypeId]
,[Permission].[intObjectTypeId]
,[Permission].[intObjectId]
,[Permission].[blnActive]
,[Permission].[blnHaveAccess]
,[Permission].[intLevelTypeId]
FROM [Group]
LEFT JOIN Permission ON [Group].[Id] = intGroupId AND
intObjectId = @ObjectId AND
intObjectTypeId = @ObjectTypeId AND
intLevelTypeId = @LevelType AND
intPermissionTypeId = @PermissionTypeId AND
blnActive = 1
WHERE [Group].[intCustomerId] = @CustomerId AND
[Group].[blnDeleted] = 0
ORDER BY strName, blnActive DESC
arParams:
arParams.Add(DatabaseHandler.MakeSqlParameter("@CustomerId", customer.Id));
arParams.Add(DatabaseHandler.MakeSqlParameter("@ObjectId", masterprocess.Id));
arParams.Add(DatabaseHandler.MakeSqlParameter("@ObjectTypeId", Convert.ToInt32(ObjectType.MasterProcess)));
arParams.Add(DatabaseHandler.MakeSqlParameter("@PermissionTypeId", Convert.ToInt32(permissiontype)));
arParams.Add(DatabaseHandler.MakeSqlParameter("@LevelType", Convert.ToInt32(leveltype)));
がDatabaseHandler.MakeSqlParameter:コメントのお返事に基づいて
public static SqlParameter MakeSqlParameter(String strName, int intInput)
{
return new SqlParameter(strName, intInput);
}
http://stackoverflow.com/questions/1642453/sql-query-and-datetime-parameter-takes-long-time-to-execute&@gbnによる回答をご覧ください。私は、SQLの予想と同期していないSQLParametersのデータ型である可能性があります。例えば、 1つ以上のSQLParameterのパラメータタイプがvarcharであるのに対し、int型である必要があります(SQLが期待するように)。 – shahkalpesh
'parameter sniffing 'の場合がありますが、' strSQL'はリテラルクエリですか、それとも内部的にクエリを呼び出すストアドプロシージャの名前ですか?どちらの場合も同じパラメータ値でテストしますか? –
おそらく、そのボックスに十分なRAMがある場合は投稿しますか?現在のRescourceが待っていることについて、SQL管理ツールから何が言われていますか? – EKS