2016-08-29 5 views
0

私は250万行のデータベーステーブルを持っています。このテーブルは、1つの列(item_no)または2つの列(item_no & subitem_no)のいずれかで照会します。私のクエリを最適化するために私は2つのインデックスを作成しました。 1つはitem_no、もう1つはitem_noとsubitem_noの組です。カラムインデックスが改善されていませんselectステートメント(Android)

例:

CREATE INDEX Idx2 ON master(item_no); 
CREATE INDEX Idx3 ON master(item_no, subitem_no); 

今、私はSQLiteのブラウザでこのクエリを実行すると:

SELECT component, hours, unit, price 
FROM master 
WHERE barcode = "234567" 
AND item_no = "1234" 

か、この1:

SELECT component, hours, unit, price 
FROM master 
WHERE barcode = "234567" 
AND item_no = "1234" 
AND subitem_no = "34" 

それは非常に高速実行されます。約76ms〜186ms。これは私が望むもので、インデックスのない元のSELECTステートメントは4000 - 6000msの間です。だから私が探していた巨大な改善です。だから私はアンドロイドデバイス(サムスンギャラクシーS6)にデータベースをロードし、同じインデックスを与える。クエリ速度の向上はありません... select文の実行にはまだ4000〜6000msかかります。

ここで私はそれをやっています。エラーが表示された場合、または予想されるパフォーマンスの向上が見られない理由を説明できるかどうか教えてください。

db.execSQL("CREATE INDEX Idx2 ON master(item_no, subitem_no);"); 
db.execSQL("CREATE INDEX Idx3 ON master(item_no);"); 

public ArrayList<Data> getData(String barcode, String itemNo) { 
    ArrayList<Data> dataList = new ArrayList<>(); 

    try { 
     Database db = Database.getInstance(); 
     db.open(); 

     String where = BARCODE_COLUMN + " = ? AND " + ITEM_NO_COLUMN + " = ?"; 
     String[] columns = {COMPONENT_COLUMN, HOURS_COLUMN, UNIT_COLUMN, PRICE_COLUMN}; 
     String[] args = {barcode, itemNo}; 
     String sort = COMPONENT_COLUMN + " ASC"; 
     Cursor cursor = db.getDb().query(true, MASTER_TABLE, columns, where, args, null, null, sort, null); 
     cursor.moveToFirst(); 

     for (int i = 0; i < cursor.getCount(); i++) { 
      Data data = new Data(); 
      data.setComponent(cursor.getString(cursor.getColumnIndex(COMPONENT_COLUMN))); 
      data.setHours(cursor.getString(cursor.getColumnIndex(HOURS_COLUMN))); 
      data.setUnit(cursor.getString(cursor.getColumnIndex(UNIT_COLUMN))); 
      data.setPrice(cursor.getString(cursor.getColumnIndex(PRICE_COLUMN))); 

      dataList.add(data); 

      if (!cursor.isLast()) { 
       cursor.moveToNext(); 
      } 
     } 

     cursor.close(); 
     db.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return dataList; 
} 
+0

は、同様に、barcode' 'にインデックスをつけ! 'WHERE'と' JOIN'フィールドのすべてにインデックスを付けるべきです。 –

+0

その論理によって、私はペアのバーコードとitem_noに1を加えるかもしれません。ありがとう、私はそれを試してみます –

+0

'item_no'はすでにインデックスされています...それともそうではありませんか? –

答えて

1

データキャッシュに問題があったはずです。私は、デバイスを再起動し、私のアプリをアンインストールしてから、インデックスの@Rotwangのコメントを更新しました。今私は私の希望の3msのクエリ時間を得る私のアプリを実行するとき。ここで

は私の修正した:

db.execSQL("CREATE INDEX Idx2 ON master(barcode, item_no, subitem_no);"); 
db.execSQL("CREATE INDEX Idx3 ON master(barcode, item_no);"); 
関連する問題