2010-11-28 5 views
24

私のAndroidアプリは、ユーザーのPCで生成され、デバイスに転送されるSQLiteデータベースを使用して動作します。それはすべて機能しますが、実際に膨大な量のデータを持つユーザーの数は予想していませんでした。このような場合、UIはデータがフェッチされるのを待っているので非常に鈍いです。インデックス付きのAndroid SQLiteのパフォーマンス

私は、確かに速くなると確信していた多くのトリックを試しましたが、何も目に見える効果がないようです。私のクエリは、ほとんどすべて非常に単純です。通常、WHERE句の場合は1つの "col = val"で、カラムの場合はINTEGERデータです。だから私は多くのクエリを行うことはできません。

最新のSQLエキスパートではなく、PCで「CREATE INDEX」コマンドを使用して、これらのインデックスを使用してデータベース検索を高速化すると考えました。インデックスはデータベースファイルのサイズを大幅に増やしたので、私のアプリのスピードには何の影響も及ぼさないように思われました。インデックスなしで塗りつぶすのに8秒かかっていた画面でも、8秒かかることがあります。私はものの少なくとも半分を得ることを望んでいた。

私は、Android上のSQLite実装がデータベースインデックスをまったく使用していない場合や、単にそれらを生成してスペースを無駄にしているだけなのかどうかは分かりません。誰もこれに答えることができますか?

また、アクセスを高速化しようとする他のものはありますか?

(これは絶対的な意味でユーザーは何の不満もありません)私の最悪のケースのユーザーは、これまでに630,000レコード(15テーブル)を生成するデータを持っていますので、できるだけ多くのデータがあります)

ダグ・ゴードン GHCSシステム

+1

いくつか遅いクエリをテーブル定義とインデックス定義と共に投稿します – Mikpa

答えて

4

あなたは数百ミリ秒のカップルよりも多くを取る行動のいくつかの種類(データベース検索され、長時間実行される計算、Web要求など)を実行しようとしているたびに、あなたはこれをAsyncTaskの中にラップすることを考慮する必要があります。

Painless Threadingはこのトピックに関する良い記事ですので、詳しく見てみることをおすすめします。

この記事では、アプリケーションは、実行時間の長い操作を処理するためにワーカースレッド 産卵で最高のUI 性能を確保することができますどのようにAndroidアプリケーションと で使用されるスレッド モデルを説明し むしろメイン スレッドでそれらを処理するよりも。

+1

私はすでにこれをやっています。問題は、要求されたデータが最終的に(onPostExecuteで)表示されるまでにかかる時間です。 – gordonwd

+0

@ gordonwd:長いリストを表示すると思います。この場合、この* Android Endless List *の質問(http://stackoverflow.com/questions/1080811/android-endless-list)で提案されているような解決策を試すことができます。誰かが上で指摘したように、テーブルからコードをいくつか投稿し、そこからデータを取得して、私たちがあなたを助けてくれるようにする必要があります。 – Nailuj

+0

@Nailujはあなたの記事のリンクがおそらくこれに変わったようです。 http://android-developers.blogspot.com.au/2009/05/painless-threading.htmlでも、404を確認して修正できますか? –

10

SQLiteはクエリに適している場合はインデックスを使用します。 EXPLAIN

EXPLAIN QUERY PLAN ... your select statement ... 

を使用して、SQLiteがどのインデックスを使用しているかを確認してください。クエリプランは、データベースコンテンツに関するいくつかの前提に基づいています。 ANALYZE

11

データベースをより効率的に照会するだけで、大いに大きなパフォーマンスを達成することができました。たとえば、情報の配列を構築するには、以前に "WHERE _id = n"タイプセレクタで必要とされた各行のデータベースを照会していました。しかし、このようにして、一度に1つずつ、12個以上のクエリを発行していました。

代わりに、私は今必要なIDのリストを構築し、 "WHERE _id IN(n1、n2、n3、...)"形式の単一のクエリですべてを取得し、返されたカーソル。これと他の構造最適化を行うことで、最大のデータベースは、より平均的な場合とほぼ同じくらい迅速に表示できます。

+2

可能ですが、クエリのマウントを減らすことは、パフォーマンスを向上させる最も効率的な方法の1つです。相対的に遅いI/Oの待機には、大きなマウント時間が費やされます。 – pierrotlefou

関連する問題