sql - 改善SQLite查询

标签 sql sqlite

我有一个事件表,其中包含约100k行。
以下是有关“事件”表的复杂查询,希望对如何优化此查询有意见...

SELECT id FROM event 
NATURAL JOIN (
    SELECT subj_id, max(timestamp) AS timestamp
    FROM event WHERE (
        timestamp >= 1342052128597 AND timestamp <= 9223372036854775807
        AND NOT subj_interpretation = 46))
    GROUP BY subj_id)
GROUP BY subj_id
ORDER BY  
timestamp DESC


查询在这里执行0.06-0.07秒。任何想法都是查询的良好索引和/或重组。

目前,我正在使用:

CREATE INDEX event_subj_id ON event(subj_id, timestamp, subj_interpretation)


查询计划如下所示:

1 0 0 SCAN TABLE event USING COVERING INDEX event_subj_id (~27777 rows)
0 0 1 SCAN SUBQUERY 1 (~100 rows)
0 1 0 SEARCH TABLE event USING INDEX event_subj_id (subj_id=? AND timestamp=?) (~9 rows)
0 0 0 USE TEMP B-TREE FOR GROUP BY
0 0 0 USE TEMP B-TREE FOR ORDER BY

最佳答案

您可以通过删除DISTINCT优化第二个查询,因为GROUP BY subj_id已经确保了没有重复的记录:

SELECT id,
       subj_id,
       max(timestamp) AS timestamp
FROM event
WHERE timestamp BETWEEN 1342055894621 AND 9223372036854775807
  AND subj_interpretation != 46
GROUP BY subj_id
ORDER BY timestamp


对于GROUP BY / timestamp / subj_interpretation查找,索引本身已经是最佳的。
但是,如果向其中添加id列,SQLite可以将其用作覆盖索引,这样就无需在events表本身中查找任何记录,这实际上可能使性能提高一倍:

0 0 0 SCAN TABLE event USING COVERING INDEX event_subj_id_plus_id
0 0 0 USE TEMP B-TREE FOR ORDER BY

关于sql - 改善SQLite查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048021/

相关文章:

SQL "WITH"性能和临时表(可能为 "Query Hint"以简化)

ios - SQLite 错误 : too many terms in compound SELECT

ios - 如何在swift中加密sqlite数据

android - 我应该如何在 Sqlite 中执行此查询?

vb.net - 如何在 SQLite 中搜索特定的 BLOB?

java - SQLite聚合查询

sql - 微软 Access VBA : Added columns to table but now SQL "INSERT INTO" won't work anymore

mysql - SQL 仅选择列上具有最大值的行

sql - SQL Server 中的条件 XML 修改

java - SQL语法异常 : could not execute query