这是我遇到的问题。我查询的表格有1.7亿行。我编写了一个存储过程来对表中的最新条目进行简单查询。当我用这样的硬编码字符串写WHERE
子句时:DATEADD在存储过程的WHERE子句中的神秘行为
SELECT top 500 a.field1 , a.field2, a.field3
FROM database..hugeTable a(nolock)
WHERE a.StartTime > '2012-07-17 10:10:35.477'
它非常快。不到一秒钟。 StartTime
位于非聚集索引中。
不过,我真正想要的是这样的:
DECLARE @fifteenMinutesAgo datetime;
SET @fifteenMinutesAgo = DATEADD(n , -15 , GETDATE());
SELECT top 500 a.field1 , a.field2, a.field3
FROM database..hugeTable a(nolock)
WHERE a.StartTime > @fifteenMinutesAgo
的问题是,当我运行第二个查询,它需要近3分钟!
所以我开始乱搞,疯狂搜索。我认为这可能是一个数据类型问题,所以我尝试了各种CAST和CONVERT,但没有成功。我尝试使用OPTIMIZE FOR
,但意识到它不适用于此版本的SQL。我检查了StartTime
的数据类型;它是类型datetime
。
,我试过了,这是非常奇怪的另一件事,是这样的:
DECLARE @fifteenDaysAgo datetime;
SET @fifteenDaysAgo = DATEADD(d , -15 , GETDATE());
SELECT top 500 a.field1 , a.field2, a.field3
FROM database..hugeTable a(nolock)
WHERE a.StartTime > @fifteenDaysAgo
我改变了它从搜索的最后15分钟,最后15天。神奇的是它又快又快了!不到一秒钟。
这使我相信,SQL以某种方式难以比较时间?它不需要查看datetime
的TIME
部分以查看它是否符合比较声明?我不知道。我在这里抓着吸管。
所以我的问题是,我怎样才能使这合理快速,仍然保持我的@fifteenMinutesAgo
动态?
您是否查看了两次查询之间的执行计划,以查看执行中可能存在的差异? – LittleBobbyTables 2012-07-17 16:31:02
我应该包括那个。是的,执行计划是相同的。 – davehale23 2012-07-17 16:33:35
您可以尝试执行存储过程'WITH RECOMPILE'选项的缓慢版本并查看是否有帮助? – a1ex07 2012-07-17 16:37:59