0

当涉及到带有日期范围的 SQLite 查询时,我遇到了一个巨大的性能问题。

在我的应用程序中,我有一个包含数千条站点记录的数据库。这些网站是可访问的,但不是全年。这些站点中的每一个都可以定义最多三个可访问的范围。因此,我创建了一个包含以下列的 SQLite 表:open1close1open2close2open3close3(以及其他)

应用程序用户可以输入他们想要访问站点的时间范围,例如 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 ) )
    )

有没有简单的方法来提高性能?

注意:我尝试使用格式的 utc 值进行打开关闭,但这并不是真正可调试的。

提前感谢您的帮助!

4

2 回答 2

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*<= first<= second<=close*

于 2013-04-18T12:26:55.393 回答
1

首先,您会发现真实设备的性能比模拟器好得多。

现在,进入问题的真正实质。WHERE您应该尝试为子句(open1close1等)中使用的那些列创建索引。你可以找到很多关于如何做到这一点的教程。简而言之,索引帮助数据库引擎快速找到匹配的记录。

尝试类似:

CREATE INDEX visitableIndex ON sites (open1, close1, ...)
于 2013-04-18T12:17:12.383 回答