【问题标题】:efficient date comparison in sqlite?sqlite中的有效日期比较?
【发布时间】:2014-05-09 00:34:28
【问题描述】:

此查询耗时过长(800mhz cpu 上超过 15000 条记录):

select count(*) from events where millis  >  date("now", "start of month")

该字段定义为millis INT,当我运行查询(或我想出的任何其他变体)时,sqlite 似乎会对它比较的每条记录进行日期转换。我用 strace 看到的:

read(3, "\r\0\0\0\21\0H\0\3\310\3\220\3X\3 \2\350\2\260\2x\2@\2\10\1\320\1\230\1`"..., 1024) = 1024
gettimeofday({1399595165, 605812}, NULL) = 0
gettimeofday({1399595165, 609833}, NULL) = 0
gettimeofday({1399595165, 611851}, NULL) = 0
gettimeofday({1399595165, 618546}, NULL) = 0
gettimeofday({1399595165, 623135}, NULL) = 0
gettimeofday({1399595165, 626291}, NULL) = 0
gettimeofday({1399595165, 634558}, NULL) = 0
gettimeofday({1399595165, 636463}, NULL) = 0
gettimeofday({1399595165, 638986}, NULL) = 0
gettimeofday({1399595165, 669426}, NULL) = 0
gettimeofday({1399595165, 675431}, NULL) = 0
...
And it keeps running

¿有没有一种有效的方法来计算属于当天的记录,将“现在”转换为 int 一次,然后进行简单的数学运算?

编辑:正如 CL 指出的那样,只需预先计算日期就足够了。无需将其转换为 int。以下工作更快(没有日期比较):

select date( "now", "-1 day");
2014-05-08
sqlite> select count(millis) from events where millis > "2014-05-08";
1177

另一件显着提高性能的事情是在列上创建索引,就像在任何其他数据库引擎上所做的那样。不知道为什么我认为 SQLite 不支持它们。

仅作记录:

sqlite> create index ievemts_millis on events (millis);
sqlite> select date( "now", "-1 day");
2014-05-08
sqlite> select count(millis) from events where millis > "2014-05-08";
1177

【问题讨论】:

  • date 返回 yyyy-mm-dd 格式的字符串 ...

标签: sql sqlite date


【解决方案1】:

对于这样一个简单的值,您可以使用两个查询:

SELECT date('now', 'start of month');

SELECT COUNT(*) FROM events WHERE millis > ?;

(在应用程序代码中只计算毫秒值可能更容易。)

最新的 SQLite 版本将只评估一次 date 函数。

【讨论】:

  • SELECT date('now', 'start of month'); 结果:2014-05-01
  • 我的错误。 select count(*) from bicis where millis > "2014-05-08" 按预期工作,即使日期写成字符串 ant 而不是我预期的 INT。 SQLite 进行全面扫描,但没有日期操作:_llseek(3, 6774784, [6774784], SEEK_SET) = 0 read(3, "\r\0\0\0\20\0\0\3\306\3\214\3R\3\30\2\336\2\244\2j\0020\1\366\1\274 \1\202\1H"..., 1024) = 1024 `
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多