为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
人到中年有点甜 2021-11-28 17:56:56
我正在使用 Dapper 从我的 Web 应用程序运行存储过程。我首先从 SSMS 运行相同的存储过程,以确保一切正常。它从 SSMS 运行 1-5 秒。然后我将我的脚本复制/粘贴到我的应用程序中以通过 Dapper 运行。当我运行我的应用程序并逐步调试我的代码时,存储过程运行了超过 2 分钟并超时。这是完全相同的代码。什么可能导致差异?这是我从 SSMS 运行的代码:DECLARE @RC intDECLARE @ownerId varchar(50)DECLARE @type varchar(50)DECLARE @dateFrom datetimeDECLARE @dateTo datetimeDECLARE @offset intDECLARE @perPage intSET @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 = 50EXECUTE @RC = dbo.IndexSearch @ownerId                             ,@type                             ,@dateFrom                             ,@dateTo                             ,@offset                             ,@perPageGO这是从我的应用程序运行的代码: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 和我的应用程序的相同登录名。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

尝试此页面中的建议:我认为参数嗅探可能是一个红鲱鱼,但 ARITHABORT 解决方案可能会奏效。无论如何,请尝试 optiins(重新编译)。


查看完整回答
反对 回复 2021-11-28
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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

已经有很多问题博客可以理解为什么!

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

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

为您的 ASP.Net 应用程序和您的 SSMS 会话查看 sys.dm_exec_sessions。我会猜测您的 SET 设置中至少有一个是不同的。这可能会导致不同的计划(最终这归因于参数嗅探)并且应用程序端通常会变得更糟。


查看完整回答
反对 回复 2021-11-28
?
青春有我

TA贡献1784条经验 获得超8个赞

解决方案应该基于将存储过程参数分配给局部变量(请查看参数嗅探)。下面我提供了一篇您可能会觉得有用的文章的链接:https : //www.tangrainc.com/blog/2007/08/parameter-sniffing/


查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信