程式碼與SSMS 中的查詢效能差異
在SQL Server Management Studio (SSMS) 中順利執行的查詢在下列情況下可能會表現得過慢:在程式碼內執行。在最近的程式碼開發過程中遇到了這種差異,促使我們調查根本原因。
程式碼實作
用於執行查詢的C# 程式碼如下:
using (var conn = new SqlConnection("Data Source=backend.example.com;...")) { using (var ada = new SqlDataAdapter(sqlCommand, conn)) { ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID); ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value); conn.Open(); Logs.Clear(); ada.Fill(Logs); // Time out exception for 30 sec limit. } }
SSMS查詢
SSMS查詢SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt FROM [ES_HISTORY] inner join [es_history_dt] on [PK_JOB] = [es_historyid] Where client_id = @clientID and dt > @dt and (job_type > 4 or job_type = 0 or job_type = 1 or job_type = 4 ) Order by dt desc
SSMS查詢
SSMS查詢從C# 程式碼中提取的相同查詢直接在SSMS中運行:
分析經檢查,兩個查詢之間存在細微差別。在 SSMS 版本中,@clientID 參數被宣告為 VARCHAR,而在 C# 程式碼中,它是使用 AddWithValue 方法新增的,該方法通常根據 .NET 變數的類型分配資料類型。在本例中,ClientID 變數是字串類型,在 SQL Server 中對應為 NVARCHAR。
影響ada.SelectCommand.Parameters.Add("@clientID", SqlDbType.VarChar, 200).Value = ClientID;這種差異對查詢效能有顯著影響。 NVARCHAR 參數類型不允許搜尋參數 (SARG) 過濾,這是 SQL Server 用於根據索引列快速定位行的關鍵最佳化技術。結果,C#程式碼中的查詢被迫執行表格掃描,效率遠低於索引查找。 解解決差異,需要在 C# 程式碼中明確指定 @clientID 參數的 VARCHAR 資料類型。這可以使用以下語法來實現:透過確保參數的資料類型與 SSMS 查詢中聲明的資料類型匹配,應用程式可以避免效能損失並立即執行查詢 -高效的方式。
以上是為什麼 My SQL Server 查詢在 SSMS 中很快,但在 C# 程式碼中卻很慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!