c# - 为什么存储过程在代码中运行缓慢,但在 SSMS 中运行速度很快?

标签 c# sql sql-server

<分区>

我正在使用 Dapper 从我的 Web 应用程序运行存储过程。我首先从 SSMS 运行相同的存储过程,以确保一切正常。它从 SSMS 运行了 1-5 秒。

然后我将我的脚本复制/粘贴到我的应用程序中以通过 Dapper 运行。当我运行我的应用程序并逐步调试我的代码时,存储过程运行了超过 2 分钟并超时。这是完全相同的代码。可能导致差异的原因是什么?

这是我从 SSMS 运行的代码:

DECLARE @RC int
DECLARE @ownerId varchar(50)
DECLARE @type varchar(50)
DECLARE @dateFrom datetime
DECLARE @dateTo datetime
DECLARE @offset int
DECLARE @perPage int

SET @ownerId = '990042064' 
SET @type = 'voice' 
SET @dateFrom = '2018-05-16 00:00:00.000'  --'YYYY-MM-DD hh:mm:ss[.nnn]' 
SET @dateTo = '2018-08-14 23:59:59.000'  --'YYYY-MM-DD hh:mm:ss[.nnn]' 
SET @offset = 0 
SET @perPage = 50

EXECUTE @RC = dbo.IndexSearch @ownerId
                             ,@type
                             ,@dateFrom
                             ,@dateTo
                             ,@offset
                             ,@perPage
GO

这是从我的应用程序运行的代码:

using (IDbConnection db = new SqlConnection(ConnectionStringHelper.ConnectionString))
{
    dbRecs = db.Query<IndexRec>(@"
    DECLARE @RC int
    DECLARE @ownerId varchar(50)
    DECLARE @type varchar(50)
    DECLARE @dateFrom datetime
    DECLARE @dateTo datetime
    DECLARE @offset int
    DECLARE @perPage int

    SET @ownerId = '990042064'
    SET @type = 'voice'
    SET @dateFrom = '2018-05-16 00:00:00.000'--'YYYY-MM-DD hh:mm:ss[.nnn]'
    SET @dateTo = '2018-08-14 23:59:59.000'--'YYYY-MM-DD hh:mm:ss[.nnn]'
    SET @offset = 0
    SET @perPage = 50

    EXECUTE @RC = dbo.IndexSearch @ownerId
                                 , @type
                                 , @dateFrom
                                 , @dateTo
                                 , @offset
                                 , @perPage
    ", commandTimeout: 120);
}

我什至尝试过在几台不同的机器上运行 SSMS,我总是在 1-5 秒内搞定。我已经从应用程序多次运行相同的查询,但它总是超时。

脚本本身是否有任何东西导致执行计划不同?我也在 SSMS 和我的应用程序中使用相同的登录名。

最佳答案

正如 Lukasz 所提到的,它可能是参数嗅探,也可能是其他原因。

已经有很多问题的博客来理解为什么!!

http://www.sommarskog.se/query-plan-mysteries.html

或者你可以试试 https://stackoverflow.com/a/12483089/1481690

Take a look at sys.dm_exec_sessions for your ASP.Net application and for your SSMS session. I will hazard a guess that at least one of your SET settings is different. This can contribute to different plans (ultimately this gets attributed to parameter sniffing) and the app side usually ends up worse off.

关于c# - 为什么存储过程在代码中运行缓慢,但在 SSMS 中运行速度很快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51849049/

相关文章:

c# - Serilog 不向 Elasticsearch 8 发送日志

javascript - 如何在 RegisterClientScriptBlock 中传递带有页面 URL 的查询字符串

MySQL 通配符查询

mysql - SQL 连接。从三个表中获取数据

mysql - 如何在 MYSQL 中选择阿拉伯语的数据?

sql - 将多个存储过程合并到一个脚本中

sql - 在 SQL Server 中解析 XML 并将其导入表

c# - 每当连接或断开网络电缆时如何获取事件

c# - 如何在c#中创建一个非矩形窗体?

sql-server - 使用 DAO 和 Sql Server 链接表的事务