2014-11-22 142 views
2

測試在Nexus 5,跑了棒棒糖更新,之後我的SQLite查詢現在需要永遠執行我會說,3倍,4倍倍比冰淇淋三明治Android的5棒棒糖SQLite的性能

的Android 4.0與航運更長3.7版本的SQLite,Android 5現在帶有改進的3.8版本,本來應該引入50%的性能提升(理論上至少)。

然而,我沒有看到這一點,SQLite的表現似乎在棒棒糖裏很可怕。

與老銀河3運行冰淇淋三明治並排測試我的查詢需要1-2秒,在棒棒糖升級查詢開始需要更長的10-15秒後。

DB創建了適當的索引。

問題只存在於棒棒糖中。

有沒有人遇到過類似的問題,以及有關如何解決的建議?

樣品查詢&解釋查詢的輸出:

SELECT DISTINCT 
t.route_id, s.stop_name, s.stop_id, s.stop_lat, s.stop_lon, s.location_type 
FROM 
stops s 
INNER JOIN stop_times st ON s.stop_id=st.stop_id 
INNER JOIN trips t ON t.trip_id=st.trip_id 
WHERE 
s.lon > -111.84006 AND s.lon < -111.81482 AND 
s.lat > 34.839073 AND s.lat < 34.86432 AND 
service_id IN (SELECT service_id FROM calendar WHERE saturday='1') 

enter image description here

+0

答案是重寫您的查詢並添加apprpriate索引。沒有數據庫模式和查詢本身,沒有人可以幫助你。 – 2014-11-22 10:06:53

+0

我覺得你的評論無效。重新編寫每個Android版本的SQL查詢不是一個有效的解決方案。如上所述,查詢在棒棒糖之外需要1-2秒。問題僅限於Android 5.0。 – AlexVPerl 2014-11-22 14:52:05

+0

所以你不希望你的查詢在任何版本上花費幾毫秒? – 2014-11-22 14:54:39

回答

1

sqlite的3.8引入了Next Generation Query Planner。它可能會做出不同的選擇,但應該是更好。

(我假設在這裏,您所查詢的查詢計劃以顯著方式源碼版本之間的不同。你只發布其中的一個。)

請允許我從docs on the new planner引用的摘錄, 「升級到NGQP的危險」:

但是,與任何查詢計劃員更改一樣,升級到NGQP確實帶來了引入性能迴歸的小風險。這裏的問題並不是NGQP不正確或者錯誤或者比傳統查詢規劃器差。給出有關指數選擇性的可靠信息,NGQP應該總是選擇一個與以前一樣好或更好的計劃。問題在於某些應用程序可能使用低質量和低選擇性的索引而未運行ANALYZE。較早的查詢計劃人員針對每個查詢查看的可能實現數量較少,因此他們可能會因愚蠢的運氣而絆倒好計劃。另一方面,NGQP着眼於更多的查詢計劃可能性,並且它可以選擇一個理論上更好的不同查詢計劃,假設索引良好,但由於數據的形狀而在實踐中給出性能迴歸。

總結:

  • 新的策劃者更依賴於正確的統計(知道哪個策略將排除行數最多速度最快)
  • 沒有他們,可能做出錯誤的選擇(選擇到使用錯誤的,甚至是沒有索引)
  • 你應該使用ANALYZE更新你的表統計信息(或者從典型/最壞情況手動插入統計信息到統計表中)

因此,看看運行ANALYZE是否有助於您的查詢性能。比較兩個sqlite版本之前和之後的查詢計劃和性能(如果您發佈了所有四種情況以供其他人查看差異,那麼它會很酷)。

+0

在我的全文搜索(FTS3)的情況下,ANALYZE性能提高了50倍。謝謝。 – 2016-02-02 17:53:13