猿问

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

我正在使用 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 和我的应用程序的相同登录名。


人到中年有点甜
浏览 404回答 3
3回答

MYYA

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

拉风的咖菲猫

正如 Lukasz 所提到的,它可能是参数嗅探,也可能是其他东西。已经有很多问题博客可以理解为什么!http://www.sommarskog.se/query-plan-mysteries.html或者你可以试试https://stackoverflow.com/a/12483089/1481690为您的 ASP.Net 应用程序和您的 SSMS 会话查看 sys.dm_exec_sessions。我会猜测您的 SET 设置中至少有一个是不同的。这可能会导致不同的计划(最终这归因于参数嗅探)并且应用程序端通常会变得更糟。

青春有我

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