2013-04-18 92 views
0

當涉及到具有日期範圍的SQLite查詢時,我遇到了巨大的性能問題。Android SQLite快速搜索日期

在我的應用程序中,我有一個數據庫,有成千上萬的網站記錄。這些網站是可見的,但不是整年。每個站點都可以定義最多三個可以訪問的範圍。因此,我創建了以下的列的SQLite表:open1close1open2close2open3close3(主要)

應用的用戶可以輸入一個時間範圍,其中他們想訪問一個網站,例如2014.01.01 - 2014.01.07

現在,當我在不限制時間的情況下執行搜索時,速度相當快。 但是,當我使用開放時間作爲搜索標準時,搜索在快速模擬器上最多需要7秒。我甚至不希望測試這個真實的設備:)

在列開放密切是類型DATETIME的條目上,看起來像:2014年1月1日

我當前的查詢如下:

SELECT open1,close1,open2,close2,open3,close3 FROM sites WHERE (
     ((strftime('%Y-%m-%d', '2014-01-01') BETWEEN open1 AND close1) AND (strftime('%Y-%m-%d', '2014-01-07') BETWEEN open1 AND close1)) 
     OR 
     ((strftime('%Y-%m-%d', '2014-01-01') BETWEEN open2 AND close2) AND (strftime('%Y-%m-%d', '2014-01-07') BETWEEN open2 AND close2)) 
     OR 
     ((strftime('%Y-%m-%d', '2014-01-01') BETWEEN open3 AND close3) AND (strftime('%Y-%m-%d', '2014-01-07') BETWEEN open3 AND close3)) 
    ) 

是否有提高性能的簡單方法?

注意:我試着在格式使用UTC值開放接近但這不是真正的可調試。

在此先感謝您的幫助!

+1

沒有調試的,特別是與索引 – njzk2

+0

所以你說我應該使用*長*而不是? – grAPPfruit

+0

我會的,是的。它使得更簡單的請求更容易優化(更容易查看要創建的索引) – njzk2

回答

1

首先,您會發現真實設備的性能要優於模擬器。

現在,談到真正的問題肉。您應該嘗試爲WHERE子句(open1close1等)中使用的列創建索引。你可以找到很多關於如何做到這一點的教程。簡而言之,索引可幫助數據庫引擎快速找到匹配的記錄。

嘗試類似:

CREATE INDEX visitableIndex ON sites (open1, close1, ...) 
+0

感謝。我在打開和關閉的列上應用了一個索引,它幫助加快了過程大約50%(未測量) – grAPPfruit

2

我不知道這是否是更有效,但它不能傷害簡化查詢:

((strftime('%Y-%m-%d', '2014-01-01') BETWEEN open1 AND close1) AND (strftime('%Y-%m-%d', '2014-01-07') BETWEEN open1 AND close1)) 

等同於:

(strftime('%Y-%m-%d', '2014-01-01') >= open1 AND strftime('%Y-%m-%d', '2014-01-07') <= close1) 

只要第一個日期(本例中爲'2014-01-01')在第二個日期('2014-01-07')之前,即你:如果你不格式化,但顯然更高效

open* < = first < = second < = close*

+0

這是一個好主意,我怎麼可能沒有親眼看到過這個? :)我會立即給出這個鏡頭並報告結果,謝謝! – grAPPfruit