代码与 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查询
从 C# 代码中提取的相同查询直接在 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 版本中,@clientID 参数被声明为 VARCHAR,而在 C# 代码中,它是使用 AddWithValue 方法添加的,该方法通常根据 .NET 变量的类型分配数据类型。在本例中,ClientID 变量是字符串类型,在 SQL Server 中映射为 NVARCHAR。
影响
这种差异对查询性能有显着影响。 NVARCHAR 参数类型不允许搜索参数 (SARG) 过滤,这是 SQL Server 用于根据索引列快速定位行的关键优化技术。结果,C#代码中的查询被迫执行表扫描,效率远低于索引查找。
解决方案
解决差异,需要在 C# 代码中显式指定 @clientID 参数的 VARCHAR 数据类型。这可以使用以下语法来实现:
ada.SelectCommand.Parameters.Add("@clientID", SqlDbType.VarChar, 200).Value = ClientID;
通过确保参数的数据类型与 SSMS 查询中声明的数据类型匹配,应用程序可以避免性能损失并立即执行查询 -高效的方式。
以上是为什么 My SQL Server 查询在 SSMS 中很快,但在 C# 代码中却很慢?的详细内容。更多信息请关注PHP中文网其他相关文章!