2011-08-05 6 views
3

私は自分のアプリケーションを最適化しようとしています。私はcursor.movetofirst()メソッドが何とか私のコードのパフォーマンスを低下させることに気付きました。ライン上android cursor movetofirst performance issue

Cursor cursor = myDbHelper.getDayInfo(new SimpleDateFormat("yyyy-MM-dd").format(myCalendar.getTime()); 

このラインは約1.6秒かかっエミュレータ、及び

if(cursor != null && cursor.moveToFirst()) 

2.1 10ミリ秒で実行されます。私はこれについてほとんど調べなかった。 Somepeopleは別のスレッドやasynctaskでこれを作ると言っていますが、これによりコードが複雑になります。 私はこのカーソルに何が実際に起こっているのか把握しようとしています。 私の質問に関連するデータベースのパフォーマンスの向上について、誰かが簡素化したりヒントを与えたりできますか?

答えて

0

moveToFirst()メソッドは他のコードよりもはるかに時間がかかるのは当然です。実際にはデータベース通信、データ読み込みなどを呼び出すデータエンゲージが行われます。実際には何もできません。助言は正しかった - すべての長い操作をAsyncTaskに移動してください。

+0

あなたは、1行のクエリですべての長い操作を意味するのですか? –

+0

テーブルに列id、foreign_id、dateがあり、日付のみのインデックスを作成した理由を見つけた後、重要なコメントを追加するように感じました。しかし、すぐに、私はforeign_idとdateカラムでインデックスを作成しなければならないことに気付きました。クエリは次のとおりです。CREATE INDEX idx ON mytable(foreign_id、date)。列の順序は重要です。 –

0

カーソルによって保持されているデータセットが大きい場合、カーソルを移動するには時間がかかります。このようなデータ集約的な操作は、別のスレッドで実行する必要があります。 AsyncTaskを使用すると、コードが少し複雑になる可能性がありますが、それだけの価値があります。これは、UIの経験が壊れていることを犠牲にしてブロックされているユーザースレッドに対するものです。

+1

すばやく再生していただきありがとうございますが、結果のデータセットは単一行ですが、合計データベースには何千もの行が含まれています。私はそれが開催されたデータセットについてではないと思います。クエリは10列の単一の行を返します。 –

2

これは答えがマークされてからしばらくありましたが、ここでは本当に大きな回答は得られませんでした。非常に大きなテーブルであっても、単一行のクエリは通常、1.6秒よりもはるかに短い時間を要します。遅い理由は、クエリしている列のインデックスがないため、それらの値を見つけるためにテーブル全体をスキャンする必要があるからです。インデックスを作成すると、時間を数分の1秒に減らすことができます。

+0

はい、しばらくしていましたが、元のデータを増やしたインデックスの列を後で作成しましたが、パフォーマンスの違いは見られませんでした。たぶんそれは一意ではないテキスト列を持つインデックス論理を作成することです。 –

+0

私は同意します - インデックスを追加してもmoveToFirst()の時間は短縮されません。 –