首页 >数据库 >mysql教程 >为什么 My SQL Server 查询在 SSMS 中很快,但在 C# 代码中却很慢?

为什么 My SQL Server 查询在 SSMS 中很快,但在 C# 代码中却很慢?

Barbara Streisand
Barbara Streisand原创
2025-01-05 14:59:42959浏览

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查询

从 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn