2013-01-05 161 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條款中提到的所有其他列。
相關問題