我的数据库中有一堆数据,我希望过滤掉已经存储超过一周的数据。我使用SQLServer,发现我可以使用' DATEDIFF
'功能
目前它工作得非常快,但我目前没有很多记录,所以任何事情都运行得很顺利。
经过网上的一些研究后我发现数据库中整数的比较比字符串的比较要快,我假设在这一点上,日期时间的比较(使用给定的函数)在大规模上更慢。 / p>
目前我会过滤掉像一周这样的旧记录:
SELECT * FROM onlineMainTable WHERE DATEDIFF(wk, Date, GETDATE()) > 1
我认为如果表中有一千行,这个查询会很慢。
状态列表示计算状态,我想知道如果我要查找特定状态而不是匹配日期时间,我是否会加快进程,为了将该状态设置为代表&#39的状态;旧记录'我需要在选择它们之前更新这些行,它看起来像这样:
UPDATE table SET Status = -1 WHERE NOT Status = -1 AND DATEDIFF(wk, Date, GETDATE()) > 1;
SELECT * FROM table WHERE Status = -1;
我使用了' -1'举个例子。
显然我可能错了,但我认为在这种情况下更新会足够快,因为不会有更多记录需要更新,因为较旧的记录已经更新了它的状态。选择会更快,因为我将匹配整数而不是日期时间。
我(可能)解决方案的缺点是每次获取数据时都会查询两次,即使可能不需要(如果每行都超过1周)。
归结为:我应该比较日期时间还是应该根据该日期时间更新整数列,然后选择使用这些整数的比较?
如果有不同的/更好的方法,我会全力以赴。
上下文 我正在为报价请求制作一个webapp。请求应在一周后过期,因为它们在此时无法生效。我需要同时显示有效请求和过期请求(因此客户有一个概述)。所有这些请求都存储在数据库表中。
答案 0 :(得分:2)
索引是设计用于改进选择查询性能的对象,缺点是它们会降低插入删除和更新操作的速度,因此必须在必要时使用它们。通常,DBMS提供了解释查询执行计划的工具。
也许你只需要在Date列上添加一个索引:
create index "index_name" on onlineMainTable(Date)
和查询可能是
SELECT * FROM onlineMainTable WHERE Date > DATEADD(week,-1,GETDATE());