DateTime.Now如何影响SQL Server中的查询计划缓存?

Bil*_*zke 2 sql-server caching sql-server-2005 sql-execution-plan

题:

DateTime.Now参数作为参数传递给proc会阻止SQL Server缓存查询计划吗?如果是这样,那么网络应用程序是否错过了巨大的性能提升?

可能解决方案

我认为DateTime.Today.AddDays(1)这是一个可能的解决方案.它会将相同的结束日期传递给sql proc(每天).用户仍然可以获得最新数据.请同意这一点.

举例:

假设我们有一个存储过程.它将数据报告给网页上的用户.用户可以设置日期范围.如果用户将今天的日期设置为"结束日期",其中包括今天的数据,则Web应用程序将传递DateTime.Now给sql proc.

假设一个用户运行一个报告5/1/2010- now经过多次转发.在网页上,用户看到5/1/20105/4/2010.但是web应用程序DateTime.Now作为结束日期传递给sql proc.因此,尽管用户正在查询类似的日期范围,但proc中的结束日期将始终不同.

假设表中的记录数和用户数都很大.所以任何性能提升都很重要 因此问题的重要性.

示例proc和execution(如果这有助于理解):

CREATE PROCEDURE GetFooData
    @StartDate datetime
    @EndDate datetime
AS

    SELECT *
    FROM Foo
    WHERE LogDate >= @StartDate
    AND LogDate < @EndDate
Run Code Online (Sandbox Code Playgroud)

这是使用DateTime.Now的示例执行:

EXEC GetFooData '2010-05-01', '2010-05-04 15:41:27' -- passed in DateTime.Now
Run Code Online (Sandbox Code Playgroud)

这是使用DateTime.Today.AddDays(1)的示例执行

EXEC GetFooData '2010-05-01', '2010-05-05' -- passed in DateTime.Today.AddDays(1)
Run Code Online (Sandbox Code Playgroud)

两个过程都返回相同的数据,因为当前时间是:2010-05-04 15:41:27.

Tom*_*lak 6

无论参数值如何,都将缓存查询计划.参数基本上保证存在一致的,可重用的查询,因为就SQL服务器而言它们是类型安全的.

你想要的不是查询计划,而是结果缓存.这将受到您描述的行为的影响.

由于您似乎只处理整天,您可以尝试传递日期,而不是日期时间,以最小化不同的参数值.还尝试在应用程序中缓存查询结果,而不是每次都进行数据库往返.