SQL Server存储过程比直接查询慢很多

Seq*_*zia 9 sql-server performance stored-procedures

我有一张超过100MM的记录表.该表具有聚簇索引和非聚簇索引.

我可以在表上使用T-SQL运行基本计数,运行需要1秒.当我在存储过程中放入相同的精确计数查询时,它需要12秒才能运行.

我查看了标准查询和存储过程的执行计划,它们都使用非聚集索引.

我不确定为什么存储过程与标准查询相比如此之慢.

在这样的情况下,我已经阅读了一些关于重新索引的内容,但我不确定为什么需要这样做.此外,重新索引需要几个小时,所以我想确保它能够正常工作.

对此的任何帮助都会很棒.

谢谢

UPDATE

这是存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE quickCount 

@sYID INT,
@eYID INT

AS
BEGIN

SET NOCOUNT ON;


    SELECT COUNT(leadID)
    FROM dbo.leads
    WHERE yearID >= @sYID
    AND yearID <= @eYID

END
GO
Run Code Online (Sandbox Code Playgroud)

这是标准查询:

SELECT COUNT(leadID)
FROM leads
WHERE yearID >= 0
AND yearID <= 99
Run Code Online (Sandbox Code Playgroud)

我确实尝试在没有参数的情况下运行它,SP运行速度更快(1秒).所以我假设它与参数有关.

Adr*_*der 16

尝试将SP更改为使用传入的变量的本地副本.

就像是

ALTER PROCEDURE quickCount  

@sYID INT, 
@eYID INT 

AS 
BEGIN 

SET NOCOUNT ON; 
    DECLARE @Local_sYID INT, 
            @Local_eYID INT 
    SELECT  @Local_sYID = @sYID INT, 
            @Local_eYID = @eYID INT

    SELECT COUNT(leadID) 
    FROM dbo.leads 
    WHERE yearID >= @Local_sYID 
    AND yearID <= @Local_eYID 

END 
Run Code Online (Sandbox Code Playgroud)

之前我发现由于参数Snffing,SP可以运行得慢很多,但是一旦你使用了变量的副本,性能就会恢复.

什么是参数嗅探?

SQL Server:参数嗅探


nin*_*xel 5

正如已经提到的,这可能是参数嗅探问题。尝试包括以下行:

OPTION (RECOMPILE)
Run Code Online (Sandbox Code Playgroud)

在 SQL 查询的末尾。

这里有一篇文章解释了什么是参数嗅探:http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx