【问题标题】:Why does the stored procedure run slow from code, but fast from SSMS? [duplicate]为什么存储过程在代码中运行缓慢,但在 SSMS 中运行速度快? [复制]
【发布时间】:2019-01-21 18:15:58
【问题描述】:

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

【问题讨论】:

  • 最有可能的参数嗅探。 Slow in the Application, Fast in SSMS?
  • 但如果是这样的话,它不会从 SSMS 开始运行缓慢吗?
  • Matt,对 Lukasz 所链接的优秀资源的最简短的阅读表明,您的问题的答案是“否”。假设你自己看看。
  • 是的,我现在确实看到了...
  • 两分钟后超时。对我来说听起来像是网络问题。你确定它甚至可以连接到 SQL 服务器?

标签: c# sql sql-server


【解决方案1】:

试试这个页面的建议:我认为参数嗅探可能是一个红鲱鱼,但 ARITHABORT 解决方案可能有效。在任何情况下都尝试 optiins(重新编译)。 SQL Query slow in .NET application but instantaneous in SQL Server Management Studio

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        相关资源
        最近更新 更多