放置在存储过程内部时,SQL Server查询运行缓慢

Sou*_*ire 6 sql-server stored-procedures sql-server-2008-r2

我有一个查询,我将存储过程.当我使用局部变量运行查询时,查询需要大约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;
Run Code Online (Sandbox Code Playgroud)

我也试过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;
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
    FROM #Output

OPTION(RECOMPILE)

END
GO
Run Code Online (Sandbox Code Playgroud)

我也试过用:

OPTION(OPTIMIZE FOR UNKNOWN )
Run Code Online (Sandbox Code Playgroud)

以及:

OPTION(QUERYTRACEON 4136)
Run Code Online (Sandbox Code Playgroud)

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

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

这些修复都来自本文" 纠正SQL Server参数嗅探不同方法 "

有没有人有类似的问题?感谢您的时间!

SQL Server 2008R2

Sou*_*ire 0

不幸的是,我不明白为什么同一个查询放在存储过程中与单独的 sql 语句相比会遇到这么多麻烦。

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

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

感谢大家的意见。