Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite搜索之间的快速日期_Android_Database_Performance_Sqlite_Date - Fatal编程技术网

Android SQLite搜索之间的快速日期

Android SQLite搜索之间的快速日期,android,database,performance,sqlite,date,Android,Database,Performance,Sqlite,Date,当涉及到带有日期范围的SQLite查询时,我会遇到一个巨大的性能问题 在我的应用程序中,我有一个包含数千条站点记录的数据库。这些网站可以访问,但不是全年都可以访问。这些站点中的每一个都可以定义最多三个可访问的范围。因此,我创建了一个包含以下列的SQLite表:open1、close1、open2、close2、open3和close3(以及其他列) 应用程序用户可以输入他们希望访问站点的时间范围,例如2014.01.01-2014.01.07 现在,当我在不限制时间的情况下执行搜索时,速度非常快

当涉及到带有日期范围的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 ) )
    )
有没有简单的方法来提高性能

注意:我尝试在打开和关闭时使用长格式的utc值,但这实际上是不可调试的


提前感谢您的帮助

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

现在,进入问题的实质。您应该尝试为
WHERE
子句(
open1
close1
等)中使用的列创建索引。你可以找到很多关于如何做到这一点的教程。不过,简单地说,索引有助于数据库引擎快速找到匹配的记录

尝试以下方法:

CREATE INDEX visitableIndex ON sites (open1, close1, ...)

首先,你会发现一个真正的设备比仿真器的性能要好得多

现在,进入问题的实质。您应该尝试为
WHERE
子句(
open1
close1
等)中使用的列创建索引。你可以找到很多关于如何做到这一点的教程。不过,简单地说,索引有助于数据库引擎快速找到匹配的记录

尝试以下方法:

CREATE INDEX visitableIndex ON sites (open1, close1, ...)

我不确定这是否更有效,但简化查询也无妨:

( ( 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 )

(strftime(“%Y-%m-%d”,“2014-01-01”)>=open1和strftime(“%Y-%m-%d”,“2014-01-07”)我不确定它是否更有效,但简化查询也无妨:

( ( 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 )

(strftime(“%Y-%m-%d”,“2014-01-01”)>=open1和strftime(“%Y-%m-%d”,“2014-01-07”)如果不格式化,则不可调试,但显然更有效,特别是使用索引,所以您是说我应该使用long吗?是的,我会这样做。它使请求更容易优化(更容易看到要创建的索引)如果不格式化它们,则不可调试,但显然效率更高,特别是使用索引。您是说我应该使用long来代替吗?我会的,是的。它使请求更简单,更容易优化(更容易查看要创建的索引)谢谢。我对打开和关闭列应用了一个索引,这有助于将过程加快50%(未测量),谢谢。我对打开和关闭列应用了一个索引,这有助于将过程加快50%(未测量),这是一个好主意,我自己怎么可能没有看到呢?:)我会马上给这个打一针并报告结果,谢谢!这是个好主意,我怎么可能自己没有看到呢?:)我会马上给这个打一针并报告结果,谢谢!