亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何防止在 SELECT 語句中嗅探 .NET 正在變成 EXEC 的參數?

如何防止在 SELECT 語句中嗅探 .NET 正在變成 EXEC 的參數?

C#
哈士奇WWW 2022-09-04 16:47:02
我有一個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,這比強制索引提示是更好的做法。


查看完整回答
反對 回復 2022-09-04
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

您的問題與參數嗅探無關。但是使用 SSMS 和后端設置選項。每當從 SSMS 執行語句時,它都會使用 SSMS 定義的屬性。您可以在

>>工具 >> SQL Server >> 高級查詢執行>>選項

你將在 SSMS 中啟用 SET ARITH_ABORT 選項。但你沒有在你的程序中。因此,在您的過程中添加以下行并再次測試。

SET ARITHABORT ON

我對您的問題非常有信心,它將通過此得到解決。


查看完整回答
反對 回復 2022-09-04
  • 2 回答
  • 0 關注
  • 131 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號