2012-06-21 36 views
1

我有點失落。我有一個應用程序正在從439397條記錄(〜32MB)的靜態SQLite數據庫中讀取數據。如何提高android中的SQLite查詢?

我上查詢被索引的列的數據庫,但它需要〜8-12秒完成查詢。我正在使用的當前查詢是爲id列表執行database.query(tableName,columnHeaders,「some_id =」+ id)。

我試着做了 「WHERE SOME_ID IN(ID1,ID2,ID3)」 的方法,但接任長的兩倍。我有一種感覺,我可能做錯了。

查詢是在做的AsyncTask,所以我在在自己能做什麼其他東西以提高性能丟失。

  • UPDATE:

我通過改變應用程序的行爲解決了這個問題。

+1

您認爲使用「限制」 – 0x5f3759df

+0

我需要所有匹配的記錄:( – kietdlam

+1

您的列表中有多少個id。 –

回答

0

您可以使用EXPLAIN QUERY PLAN以確認您的索引確實被正確使用。

您可以試着用COUNT(*)而不是真正的列列表來運行您的查詢,以查看問題是否是實際從閃存中讀取行數據的行爲(如果存在大量匹配,很多大列)。

你可以嘗試運行查詢,以匹配單個ID(而不是他們的N),開始設法得到對這個問題是否太多比較的手柄。

但是,請記住,AsyncTask不以某種方式使事情更快神奇。它使神奇的東西不能在主應用程序線程上運行。

+0

我可以確認索引正在被使用,而且,如果沒有索引,查詢將會花費我們應該在一個線程上執行查詢嗎? – kietdlam

+0

@ ktklam9:你已經在一個線程上進行查詢 - 由AsyncTask提供的線程再一次,簡單地將查詢移動到後臺將不會使查詢花費更少的時間,但它會阻止你通過綁定主應用程序線程來獲得ANR – CommonsWare

+0

如何分割q uery到幾個線程?有些設備是多核的,結果可能會被MergeCursor包裝。 – pawelzieba

0

看起來你沒有該領域的索引。請注意,如果您在實際查詢中使用它們進行過濾/排序/分組,則索引可能需要覆蓋幾個字段(由於我沒有看到它,因此無法詳細說明)。