我正在使用 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 回答
拉风的咖菲猫
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 设置中至少有一个是不同的。这可能会导致不同的计划(最终这归因于参数嗅探)并且应用程序端通常会变得更糟。
青春有我
TA贡献1784条经验 获得超8个赞
解决方案应该基于将存储过程参数分配给局部变量(请查看参数嗅探)。下面我提供了一篇您可能会觉得有用的文章的链接:https : //www.tangrainc.com/blog/2007/08/parameter-sniffing/
- 3 回答
- 0 关注
- 403 浏览
添加回答
举报
0/150
提交
取消