【问题标题】:SQLite - select expression is very slowSQLite - 选择表达式很慢
【发布时间】:2012-04-04 15:25:56
【问题描述】:

我在使用 SQLite 中的查询时遇到了一些严重的性能问题。目前,activity_tbl 表中有大约 20000 个条目,activity_data_tbl 表中有大约 40 个条目。我对下面查询中使用的两列都有一个索引,但它似乎对性能没有任何影响。

SELECT a._id, a.start_time + b.length AS time 
FROM activity_tbl a INNER JOIN activity_data_tbl b 
       ON a.activity_data_id = b._data_id 
WHERE time > ? 
ORDER BY 2 
LIMIT 1

如您所见,我选择一列和一个通过将两列相加而创建的值。我想这是导致性能低下的原因,因为如果我只选择 a.start_time 或 b.length,查询会非常快。

你们对我如何优化这个有什么建议吗?

【问题讨论】:

  • 您可以发布带有索引的架构 (.s) 吗?
  • 两个cmets:不要通过更改标题来标记已回答的问题,而是在以下答案之一旁边打勾(如果答案是您自己的,您可以回复自己的问题并标记答案正确)。此外,针对小的开始时间进行过滤可能不会(取决于数据的“形状”)为您提供与原始查询相同的结果。

标签: sql sqlite


【解决方案1】:

尝试在时间列上放置索引。这应该会加快查询速度

【讨论】:

    【解决方案2】:

    此查询无法使用过滤器部分的索引进行优化,因为您正在对计算值进行过滤和排序。要优化查询,您需要过滤实际表列之一(开始时间或长度)或在查询之前预先计算时间值。

    索引有帮助的唯一地方,我假设你有一个,在 b.data_id 上。

    【讨论】:

      【解决方案3】:

      复合索引可能会有所帮助。根据其文档,如果索引有足够的信息,SQLite 会尝试避免访问该表。因此,如果引擎完成了它的作业,它将认识到索引足以计算 where 子句的值并节省一些时间。如果它不起作用,则只有预计算会起作用。

      如果您经常遇到类似的任务,请阅读:http://www.sqlite.org/rtree.html

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 2014-12-02
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多