【发布时间】:2012-10-22 04:47:23
【问题描述】:
我有一张表,里面有超过 100MM 的记录。该表有一个聚集索引和一个非聚集索引。
我可以使用 T-SQL 在表上运行基本计数,运行时间为 1 秒。当我将相同的精确计数查询放入存储过程中时,它需要 12 秒才能运行。
我查看了标准查询和存储过程的执行计划,它们都使用了非聚集索引。
我不确定为什么存储过程与标准查询相比如此缓慢。
我已经阅读了一些关于在这种情况下重新索引的内容,但我不确定我为什么需要这样做。此外,重新索引需要几个小时,所以我想确保它能够正常工作。
在这方面的任何帮助都会很棒。
谢谢
更新
这是存储过程:
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,有没有传入任何参数?
-
我认为您需要显示您的查询和 SP。
-
您可能会尝试使用常量进行查询,而您的过程使用参数而不是此常量。我建议您创建 SQLFiddle 示例或发布有关架构和查询/sp 的一些详细信息
-
您是否针对“冷”页面缓冲区运行两者?或者你先跑这两个中的哪一个?在运行这两者中的任何一个之前,我会尝试执行
DBCC DROPCLEANBUFFERS和DBCC FREEPROCCACHE- 执行时间差异是否仍然存在?还是现在两者速度一样? -
Afaik 没关系,但您可以尝试使用
SET ANSI_NULLS ON进行简单查询吗?
标签: sql-server performance stored-procedures