sql-server – SQL Server存储过程比直接查询慢很多
发布时间:2021-01-01 04:35:58  所属栏目:MsSql教程  来源:网络整理 
            导读:我有一张超过100MM的记录表.该表具有聚簇索引和非聚簇索引. 我可以在表上使用T-SQL运行基本计数,运行需要1秒.当我在存储过程中放入相同的精确计数查询时,它需要12秒才能运行. 我查看了标准查询和存储过程的执行计划,它们都使用非聚集索引. 我不确定为什么存储
                
                
                
            | 我有一张超过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这是标准查询: SELECT COUNT(leadID) FROM leads WHERE yearID >= 0 AND yearID <= 99 我确实尝试在没有参数的情况下运行它,SP运行速度更快(1秒).所以我假设它与参数有关. 解决方法尝试将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之前我发现由于参数Snffing,SP可以运行得慢很多,但是一旦你使用了变量副本,性能就会恢复. What is Parameter Sniffing ? SQL Server : Parameter Sniffing (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
站长推荐
            
        热点阅读
            
