私は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;
}
は、同様に、barcode' 'にインデックスをつけ! 'WHERE'と' JOIN'フィールドのすべてにインデックスを付けるべきです。 –
その論理によって、私はペアのバーコードとitem_noに1を加えるかもしれません。ありがとう、私はそれを試してみます –
'item_no'はすでにインデックスされています...それともそうではありませんか? –