2013-01-05 163 views
1

我有位于内存映射分区上的sqlite3数据库中的表。我有select语句看起来像这样与此查询计划:sqlite3需要花费时间

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 

现在,如果我那时他的查询计划为主打表两次加秩序,而表中有130万行需要更长的时间的4倍得比较早,但过滤的行只有两个。

这是新的查询计划:

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 

任何想法?我究竟做错了什么?

回答

2

SQLite会尝试通过在i_workbook_id列上创建临时索引来优化您的第二个查询。 该查找多次完成,因为OR表达式无法以更好的方式进行优化。 (见query optimizerquery planner文档)。

什么你可以尝试做的是

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