我有一個SQL查詢,當我使用SQL Management Studio時需要不到一秒的時間執行,但是當我的代碼執行它時,它需要超過30秒從數據庫服務器獲取結果。結果包含1700行。另一個類似的查詢返回900行,需要幾ms來執行。什麼可能是這種奇怪行爲的原因?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。我想,它可能是SQLParameters的數據類型,它與SQL所期望的不同步。對於例如一個或多個SQLParameter的參數類型可能是varchar,而它應該是一個int(正如SQL期望的那樣)。 – shahkalpesh
這可能是一個「參數嗅探」的情況,但是爲了應用:strSQL是字面查詢,還是一些在內部調用查詢的存儲過程的名稱?在這兩種情況下,您是否使用相同的參數值進行測試? –
也許發佈,如果該框有足夠的內存? SQL管理工具對當前的Rescource說了什麼等待? – EKS