问题:
将 DateTime.Now
作为参数传递给 proc 是否会阻止 SQL Server 缓存查询计划?如果是这样,那么网络应用程序是否会错过巨大的性能提升?
可能的解决方案:
我认为DateTime.Today.AddDays(1)
将是一个可能的解决方案。它将把相同的结束日期传递给 sql 过程(每天)。用户仍然可以获得最新的数据。请也谈谈这一点。
给定示例:
假设我们有一个存储过程。它在网页上向用户报告数据。用户可以设置日期范围。如果用户将今天的日期设置为“结束日期”(其中包括今天的数据),则 Web 应用程序会将 DateTime.Now
传递给 sql 过程。
假设一个用户多次运行一份报表(5/1/2010
到现在
)。在网页上,用户看到 5/1/2010
到 5/4/2010
。但 Web 应用程序将 DateTime.Now
传递给 sql 过程作为结束日期。因此,尽管用户正在查询相似的日期范围,但过程中的结束日期始终会有所不同。
假设表中的记录数和用户数都很大。因此,任何性能提升都很重要。因此这个问题很重要。
示例过程和执行(如果有助于理解):
CREATE PROCEDURE GetFooData
@StartDate datetime
@EndDate datetime
AS
SELECT *
FROM Foo
WHERE LogDate >= @StartDate
AND LogDate < @EndDate
这是使用 DateTime.Now 的示例执行:
EXEC GetFooData '2010-05-01', '2010-05-04 15:41:27' -- passed in DateTime.Now
这是使用 DateTime.Today.AddDays(1) 的示例执行
EXEC GetFooData '2010-05-01', '2010-05-05' -- passed in DateTime.Today.AddDays(1)
两个过程返回相同的数据,因为当前时间是:2010-05-04 15:41:27
。
最佳答案
无论参数值如何,查询计划都将被缓存。参数基本上保证存在一致的、可重用的查询,因为就 SQL Server 而言,它们是类型安全的。
你想要的不是查询计划,而是结果缓存。这会受到你所描述的行为的影响。
由于您似乎只处理一整天,因此您可以尝试传入日期而不是日期时间,以最大限度地减少不同的参数值。还可以尝试在应用程序中缓存查询结果,而不是每次都进行数据库往返。
关于sql-server - DateTime.Now 如何影响 SQL Server 中的查询计划缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2769434/