2

SD カードに 168 MB の sqlite データベースがあり、それぞれに 1000 を超えるレコードを持つ 30 近くのテーブルが含まれています。このクエリを使用して、データベースから結果を取得しています。

select code mfr_code, name mfr_name
from manufacturers
where mfgr_type_code < 5 and code in (
        select mfgr_code
        from equipment_groups
        )

このクエリは、カーブ 5.0 で 30 秒以上、torch 6.0 デバイスで 1 分以上かかります。

サブクエリ

SELECT mfgr_code FROM equipment_groups

50,000 件を超えるレコードを取得しています。

Android でのテストに 5 秒もかからない場合の同じクエリ。ブラックベリーの問題は何ですか。

この処理時間を短縮する他の方法はありますか。

編集

このコードを使用して、データベースから結果を取得しています

     Vector vehical_type  = new vector()
Cursor cursor = statement.getCursor();
            while (cursor.next()) {
                Row row = cursor.getRow();
                vehical_type.addElement(row.getString(0));
            }

初めて実行されたときのcursor.next()は、INを使用したクエリで10を超えています。残りの 20 秒はループによって完了します。

そこで、以下に提案するように EXISTS でクエリを使用しました。パフォーマンスが大幅に向上します。

しかし、私が観察したのは、同じcursor.next()が初めて1秒かかり、ループを完了するのに10秒近くかかっていることです。ここで、ループのパフォーマンスがデータ全体をフェッチするための合計応答時間に影響を与えるという結論に達しました。

カーソルをループする以外に、データをフェッチする他の方法はありますか。

パフォーマンスをさらに向上させる可能性はありますか。

4

1 に答える 1

1

クエリを書き直してみましたか? ここにいくつかのアイデアがあります:

equipment_groups.mfgr_code列が一意でない場合:

SELECT code mfr_code, name mfr_name
  FROM manufacturers
 WHERE mfgr_type_code < 5
   AND EXISTS (
           SELECT 1
             FROM equipment_groups
            WHERE mfgr_code = code
       );

一意の場合:

SELECT code mfr_code, name mfr_name
FROM      manufacturers
LEFT JOIN equipment_groups ON mfgr_code = code
WHERE mfgr_type_code < 5;
于 2012-07-10T22:43:54.463 に答える