【问题标题】:SQL Server Query runs slow when placed inside of a stored procedure放置在存储过程中时,SQL Server 查询运行缓慢
【发布时间】:2015-12-16 20:18:19
【问题描述】:

我有一个要放入存储过程的查询。当我使用局部变量运行查询时,查询需要大约 1 秒才能运行。当我将相同的查询放入存储过程并调用 SP 时,运行大约需要 2 分钟。

从之前的问题中,我认为这可能与参数嗅探有关。当我在我的 SP 中声明局部变量然后在整个过程中使用局部变量之前遇到了这个问题。这在过去有效,但在这种情况下似乎对我没有帮助。

我现在有

CREATE PROCEDURE dbo.ProcedureName

    @DIV VARCHAR(4),
    @STD VARCHAR(1), -- S or N
    @scen varchar(20)
AS
BEGIN

    DECLARE 
        @DIV_copy VARCHAR(4),
        @STD_copy VARCHAR(1),
        @scen_copy varchar(20);
    SELECT
        @DIV_copy = @DIV,
        @STD_copy = @STD,
        @scen_copy = @scen;

我也试过像这样添加WITH RECOMPILE

CREATE PROCEDURE dbo.ProcedureName

    @DIV VARCHAR(4),
    @STD VARCHAR(1), -- S or N
    @scen varchar(20)

WITH RECOMPILE
AS
BEGIN

    DECLARE 
        @DIV_copy VARCHAR(4),
        @STD_copy VARCHAR(1),
        @scen_copy varchar(20);
    SELECT
        @DIV_copy = @DIV,
        @STD_copy = @STD,
        @scen_copy = @scen;

此外,我尝试在我的 SP 末尾添加 OPTION(RECOMPILE),如下所示:

SELECT *
    FROM #Output

OPTION(RECOMPILE)

END
GO

我也尝试过使用:

OPTION(OPTIMIZE FOR UNKNOWN )

还有:

OPTION(QUERYTRACEON 4136)

在此选项中,我没有适当的查询跟踪权限。

上述 5 个修复似乎都无法解决该问题,因为对于在存储过程之外需要 1 或 2 秒的相同查询,存储过程仍然需要 2 分钟到 2 分 30 秒之间的任何时间。

这些修复都来自这篇文章'Different Approaches to Correct SQL Server Parameter Sniffing'

有没有人遇到过类似的问题?感谢您的宝贵时间!

SQL Server 2008R2

【问题讨论】:

  • 听起来确实像参数嗅探,我不知道它可能是什么。您可以查看这篇文章,看看它是否提供了您尚未尝试过的任何其他解决方案:sommarskog.se/query-plan-mysteries.html
  • I have tried adding the OPTION(RECOMPILE) at the end of my SP - 它应该放在有问题的查询之后。但如果 with recompile 不起作用,我怀疑这种更正是否会起作用。
  • 我有完全相同的症状,创建参数的本地副本总是可以解决它。唯一的区别是我一直使用 SET 语句而不是 SELECT 语句将值复制到局部变量中。
  • 我遇到过类似的情况,为了解决我调整查询从而改变查询计划来解决这个问题,你能分享一下实际的查询计划和查询吗?

标签: sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

不幸的是,与单独的 sql 语句相比,为什么将相同的确切查询放在存储过程中时会出现如此多的麻烦。

作为一种“解决方法”,我花了一些时间在 SP 中优化我的查询。我意识到我要加入的一个表非常大(数百万行),所以我所做的是从大表中获取相关数据并创建一个临时表来保存它,然后加入(很多)更小的临时表这似乎起到了作用。 SP 现在在 3-4 秒内执行。

除了基础知识之外,我对 SQL 还有些陌生,所以我学到了很多东西。让这提醒您仔细检查您的查询,通常还有改进的余地。这感觉有点像透明胶带和回形针,但我的问题已经解决了。

感谢大家的意见。

【讨论】:

  • 与临时表相比,您可能会通过向与连接条件匹配的大表添加索引来做得更好。
  • 是的,但我没有这样做的权限,尽管我可以询问我们的 DBA 团队。
猜你喜欢
  • 1970-01-01
  • 2011-06-27
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多