我有一個SQL SELECT語句,它在SQL Server Management Studio中運行得非常快(5秒),但從我的 ASP.NET 代碼中運行得非常慢。我讀過這可能與參數嗅探有關。當我從 SSMS 運行 SELECT 語句時,我使用的是 SELECT。但是當我觀看SQL事件探查器時,我的SELECT語句作為具有模式的存儲過程執行:exec sp_executesql N'SELECT foo FROM bar,其中userid = @userid',N'@userid int',@userid= 2此 ASP.NET 代碼在四分鐘后超時(連接字符串設置):SqlCommand objCommand = new SqlCommand("SELECT foo FROM bar WHERE userid = @userid", objCS);SqlDataReader reader;objCommand = new SqlCommand("", objCS);objCommand.CommandType = CommandType.Text;objCommand.Parameters.Add("@userid", SqlDbType.Int).Value = 1;SqlDataReader reader = objCommand.ExecuteReader();在 objCommand.ExecuteReader() 上超時;此代碼在 SQL Server Management Studio 中執行,時長 5 秒:DECLARE @userid AS Int = 2SELECT foo FROM bar WHERE userid = @userid在 5 秒內返回 60000 多行。如何使 ASP.NET 代碼作為 SELECT 語句而不是存儲過程執行,同時保留參數化存儲過程的安全值?編輯:我認為這可能與使用SQL語句運行代碼的不同用戶與在SSMS中運行SQL語句的用戶有關。從代碼運行的用戶具有不同的服務器權限,包括對表的有限訪問權限。SQL 語句包含一個視圖,并且用戶對該視圖中的所有表沒有基礎 SELECT 訪問權限。這是否也意味著他們無法獲得統計數據?
2 回答

慕的地10843
TA貢獻1785條經驗 獲得超8個贊
如果它確實是參數嗅探(您必須查看實際計劃才能確定),并且您確定您有正確的索引,則可以更新查詢以使用索引提示,但IMO不是最佳方法。如果可以將查詢放入存儲過程中,則可以使用“重新編譯”標記存儲過程,這樣它就不會重用第一個計劃。IMO,這比強制索引提示是更好的做法。

蕭十郎
TA貢獻1815條經驗 獲得超13個贊
您的問題與參數嗅探無關。但是使用 SSMS 和后端設置選項。每當從 SSMS 執行語句時,它都會使用 SSMS 定義的屬性。您可以在
>>工具 >> SQL Server >> 高級查詢執行>>選項
你將在 SSMS 中啟用 SET ARITH_ABORT 選項。但你沒有在你的程序中。因此,在您的過程中添加以下行并再次測試。
SET ARITHABORT ON
我對您的問題非常有信心,它將通過此得到解決。
- 2 回答
- 0 關注
- 131 瀏覽
添加回答
舉報
0/150
提交
取消