2017-01-28 4 views
0

を取得するために15秒を要し問い合わせ:単純なSELECTステートメントが17、レコード

select Name, id, Status, position,AId, Type from Building where Status != 0 and type = 0 order by Position 

このクエリは、PC上でSQLiteのブラウザ上で一つだけの1msかかりますが、同じクエリは、Androidデバイス上でのみ17レコードをフェッチするために約15秒かかります。

私は、次のインデックス

create index B_type_position on building(type,position ASC) 

を使用してクエリを説明しているが、それはまだレコードを取得するにはあまりにも多くの時間を割いて、オプティマイザによって使用されていることを示しています。

db.rawQuery(SQL,null);ステートメントの前後の印刷タイムスタンプに基づいて時間が計算されます。あなたのインデックスがタイプと位置にあるので、あなたのインデックスは、エンジンがまだテーブルスキャンの多くを行う必要があり、部分的に効率的であるのに対し、あなたは、あなたがタイプとステータスをフィルタリングしている

を持っているどのように多くのレコード

+1

あなたのクエリはそれほど遅くするべきではありませんが、インデックスにステータスカラムを追加する必要があります。 – Garett

+0

ああ、あなたは17レコードしか持っていません。これはあなたが持っている指標にかかわらず飛ぶはずです。時間を正確に測定していますか?あなたはループ内で10のクエリを実行し、それらを実行するのに3分以上かかりますか?あなたのデバイスに何か他のことはありますか?実際のデバイスやエミュレータにいますか? – Vlad

+0

問題が見つかりました。 シングルトンパターンのために、バックグラウンドスレッドから呼び出される複雑なクエリは実行に時間がかかり、この単純なクエリはそのクエリが実行を完了するまで待つ必要があります。 私はこの問題を解決するために、読み取り操作のためのdbHelperのseptateオブジェクトを作成し、書き込み操作のためにシングルトンオブジェクトを使用しました。 それは良い練習かどうかわかりませんが、私の問題を解決しました –

答えて

0

。また、データをフィルタリングした後、インデックスを持たないポジションでソートしています。タイプ、位置はここでもあまり役に立ちません

+1

問題が見つかりました。 シングルトンパターンのために、バックグラウンドスレッドから呼び出される複雑なクエリは実行に時間がかかり、この単純なクエリはそのクエリが実行を完了するまで待つ必要があります。 私はこの問題を解決するために、読み取り操作のためのdbHelperのseptateオブジェクトを作成し、書き込み操作のためにシングルトンオブジェクトを使用しました。 それは良い練習かどうかわかりませんが、私の問題を解決しました –

関連する問題