我有一张超过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可以运行得慢很多,但是一旦你使用了变量副本,性能就会恢复.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。