对于带有日期范围的SQLite查询,我遇到了巨大的性能问题。
在我的应用程序中,我有一个包含数千个站点记录的数据库。这些网站是可访问的,但不是全年。这些站点中的每一个都可以定义最多三个可访问的范围。因此,我创建了一个包含以下列的SQLite表: open1 , close1 , open2 , close2 , open3 和 close3 (等等)
应用程序用户可以输入他们想要访问网站的时间范围,例如2014.01.01 - 2014.01.07
现在,当我在不限制时间的情况下执行搜索时,它非常快。 但是当我使用开放时间作为搜索条件时,在快速模拟器上搜索最多需要7秒钟。我甚至不想在真实的设备上测试这个:)
列打开和关闭中的条目属于 DATETIME ,类似于: 2014-01-01
我目前的查询如下:
SELECT open1,close1,open2,close2,open3,close3 FROM sites WHERE (
( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open1 AND close1 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open1 AND close1 ) )
OR
( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open2 AND close2 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open2 AND close2 ) )
OR
( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open3 AND close3 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open3 AND close3 ) )
)
有没有一种简单的方法来改善效果?
注意:我尝试使用 long 格式的utc值来打开和关闭,但这实际上不是可调试的。
提前感谢您的帮助!
答案 0 :(得分:2)
我不确定它是否更有效但是简化查询不会有害:
( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open1 AND close1 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open1 AND close1 ) )
相当于:
( strftime('%Y-%m-%d', '2014-01-01') >= open1 AND strftime('%Y-%m-%d', '2014-01-07') <= close1 )
只要第一个日期(在这种情况下为“2014-01-01”)在第二个日期('2014-01-07')之前,即您有:
open*
&lt; = first
&lt; = second
&lt; = close*
答案 1 :(得分:1)
首先,您会发现真实设备的性能远远优于仿真器。
现在,问题的真正含义。您应该尝试为WHERE
子句(open1
子句(close1
,CREATE INDEX visitableIndex ON sites (open1, close1, ...)
等)中使用的列创建索引。你可以找到很多关于如何做到这一点的教程。简而言之,索引可以帮助数据库引擎快速找到匹配的记录。
尝试类似:
{{1}}