2012-04-04 56 views
2

我在使用SQLite查詢時遇到了一些嚴重的性能問題。目前在表activity_tbl以及表activity_data_tbl中大約有20000個條目。我在下面的查詢中使用了兩個列的索引,但它對性能沒有任何影響。SQLite - 選擇表達式非常慢

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,查詢速度非常快。

你們有什麼建議可以優化這個嗎?

+0

您可以發佈具有索引架構('.s')? – netcoder 2012-04-04 15:35:17

+0

兩條評論:不要通過更改標題來標記回答的問題,而應在下面的答案旁邊勾選複選標記(如果答案是您自己的答案,您可以回答自己的問題並將答案標記爲正確)。此外,過濾一個小的開始時間可能不會(取決於您的數據的「形狀」)爲您的原始查詢提供相同的結果。 – 2012-04-05 11:24:58

回答

0

嘗試在時間列上放置索引。這應該加快查詢速度

+3

沒有時間欄。 – 2012-04-04 15:51:15

0

由於您正在篩選和對計算值進行排序,因此使用篩選器部分的索引無法優化此查詢。要優化查詢,您需要過濾實際表格列(starttime或length),或者在查詢之前預先計算時間值。

唯一的索引將幫助,我假設你有一個,是在b.data_id。

+0

謝謝你們, – Teapot01 2012-04-05 07:18:33

0

複合索引可能有幫助。根據它的文檔,SQLite試圖避免訪問表,如果索引有足夠的信息。因此,如果引擎做了功課,它會認識到索引足以計算where子句的值,並騰出一些時間。如果它不起作用,只有預先計算會做。

如果你更經常有類似的任務面前,請仔細閱讀本:http://www.sqlite.org/rtree.html