【问题标题】:sqlite3 order by takes timesqlite3 order by 需要时间
【发布时间】:2012-12-19 16:12:50
【问题描述】:

我在 sqlite3 db 中有位于内存映射分区上的表。我有如下查询计划的 select 语句:

sqlite3> EXPLAIN QUERY PLAN SELECT sst.prefix, 0 AS pb, sst.rate, 
sst.rate_n, sst.interval_1, sst.interval_n
FROM sch AS sst
WHERE
sst.i_workbook_id = 989 AND 
sst.prefix IN ('', '1', '19', '191', '1919', '19198') AND 
sst.activation_date <= DATETIME('now') AND 
(sst.expiration_date > DATETIME('now') OR sst.expiration_date IS NULL) AND
sst.start_time <= TIME('now') AND 
sst.end_time >= TIME('now');


0|0|0|SCAN TABLE sch AS sst (~185 rows)
0|0|0|EXECUTE LIST SUBQUERY 1

现在,如果我添加订单,那么他的查询计划会两次访问主表,并且比以前长 4 倍,而表有 130 万行但过滤的行只有两个。

这是新的查询计划:

sqlite3> EXPLAIN QUERY PLAN SELECT sst.prefix, 0 AS pb, sst.rate, 
sst.rate_n, sst.interval_1, sst.interval_n
FROM sch AS sst
WHERE
sst.i_workbook_id = 989 AND 
sst.prefix IN ('', '1', '19', '191', '1919', '19198') AND 
sst.activation_date <= DATETIME('now') AND 
(sst.expiration_date > DATETIME('now') OR sst.expiration_date IS NULL) AND
sst.start_time <= TIME('now') AND 
sst.end_time >= TIME('now') order by sst.prefix;     

0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|SEARCH TABLE sch AS sst USING AUTOMATIC COVERING INDEX (i_workbook_id=?) (~7 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|SEARCH TABLE sch AS sst USING AUTOMATIC COVERING INDEX (i_workbook_id=?) (~7 rows)
0|0|0|EXECUTE LIST SUBQUERY 1
0|0|0|USE TEMP B-TREE FOR ORDER BY

有什么想法吗?我做错了什么?

【问题讨论】:

    标签: python sql select sqlite sql-order-by


    【解决方案1】:

    SQLite 尝试通过在 i_workbook_id 列上创建临时索引来优化您的第二个查询。 由于无法以更好的方式优化 OR 表达式,因此多次执行该查找。 (请参阅 query optimizerquery planner 文档。)

    你可以尝试做的是

    • i_workbook_id 列上创建索引;或到
    • i_workbook_idprefix 列上创建索引;或到
    • 首先在这两个列上创建一个覆盖索引,然后在SELECTWHERE 子句中提到的所有其他列上创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2020-05-05
      • 2014-12-06
      相关资源
      最近更新 更多