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

标签 sql-server sql-server-2005 caching sql-execution-plan

问题:

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

可能的解决方案:

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

给定示例:

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

假设一个用户多次运行一份报表(5/1/2010现在)。在网页上,用户看到 5/1/20105/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/

相关文章:

caching - 将 Redis 用于 Symfony/var/cache 和/var/logs

caching - 清除Plone的CSS缓存的最佳方法是什么?

sql-server - SQL 查询 - "TypeError: sequence item 0: expected string, Decimal found"使用值

sql - 在 SP 中动态引用 SQL Server 列

SQL Server : how to return 1 row Boolean/string from in SELECT from multiple rows?

c# - SQL 服务器 : are transaction locking table for other users?

sql - 从路径中删除文件名

sql-server - 记录表架构更改

sql - 按逗号连接列的 sql 查询分组

java - 任何可以限制内存缓存的内存使用的 Java 缓存,而不仅仅是实例计数?