2011-09-15 191 views
4

我有一個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); 
} 
+1

看看http://stackoverflow.com/questions/1642453/sql-query-and-datetime-parameter-takes-long-time-to-execute&答案由@gbn。我想,它可能是SQLParameters的數據類型,它與SQL所期望的不同步。對於例如一個或多個SQLParameter的參數類型可能是varchar,而它應該是一個int(正如SQL期望的那樣)。 – shahkalpesh

+0

這可能是一個「參數嗅探」的情況,但是爲了應用:strSQL是字面查詢,還是一些在內部調用查詢的存儲過程的名稱?在這兩種情況下,您是否使用相同的參數值進行測試? –

+0

也許發佈,如果該框有足夠的內存? SQL管理工具對當前的Rescource說了什麼等待? – EKS

回答

1

根據對評論您的回覆,我會說,正確的辦法是指標。

最簡單的方法是在運行普通查詢時運行sql日誌,然後運行sql profiler。

根據其建議,可能會發現缺少索引。

+1

運行查詢時,Rescource等待表示0,但處理器時間達到100%您似乎將我推向了正確的方向。我發現我可以重建索引,我在我的許可表上做了這些,現在它以正常速度運行。仍然不明白爲什麼在管理工作室中運行查詢要比在代碼庫中運行查詢要快得多。 –

0

我有同樣的問題,但在看這個問題時想到了解決方案。

當您使用帶有參數的SQLCommand運行查詢時,查詢不會執行相同的操作。它使用存儲過程幫助程序打包參數。像Exec sp_Execute一樣。

如果你做參數替換你應該注意到一個改進(我知道有SQL注入的風險,然後)。

此外,您可以更進一步,並在表格旁邊指定WITH(INDEX)以指定要使用的索引。 (因爲它可能會嘗試使用PK索引)。