为什么存储过程从代码运行慢,而从SSMS运行快?

时间:2018-08-14 20:08:23

标签: c# sql sql-server dapper

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

3 个答案:

答案 0 :(得分:1)

如Lukasz所述,它可能是参数嗅探,也可能是其他。

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

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

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

  

看看ASP.Net应用程序的sys.dm_exec_sessions和   用于您的SSMS会话。我会猜测,至少有一个   SET设置不同。这可以有助于制定不同的计划   (最终这归因于参数嗅探)和应用   通常会变得更糟。

答案 1 :(得分:1)

尝试此页上的建议:我认为参数嗅探可能会引起麻烦,但是ARITHABORT解决方案可能会起作用。在任何情况下,请尝试使用optiins(重新编译)。 SQL Query slow in .NET application but instantaneous in SQL Server Management Studio

答案 2 :(得分:0)

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