首頁 > 資料庫 > mysql教程 > 為什麼 My SQL Server 查詢在 SSMS 中很快,但在 C# 程式碼中卻很慢?

為什麼 My SQL Server 查詢在 SSMS 中很快,但在 C# 程式碼中卻很慢?

Barbara Streisand
發布: 2025-01-05 14:59:42
原創
959 人瀏覽過

Why is My SQL Server Query Fast in SSMS but Slow in C# Code?

程式碼與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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板