Android開発におけるSQLite最適化
SQLiteの最適化については、まずSQL文ロットで処理できるので、単筆で操作するのではなく、Cursorではなくてもいいです.たとえば、複数のDELETE/UPDATEでは、条件をSQL文に組み込むと、CURSORの1つのバーを使用した検索よりも削除効率が高くなります(数年前から、単一の操作の代わりにストレージ・プロシージャを使用して、1回のバッチ計算時間を1日から数分以内に短縮していましたので、参考にしてください).次に、操作の最適化です.INSERT/UPDATE操作が多い場合はトランザクションを使用し、SELECT操作が多い場合はインデックスを使用します.
現在の作業と結びつけて,操作の最適化を発見し,以下の文章を翻訳してアーカイブすることができる.以下は本文です.
SQLiteには簡潔なSQLインタフェースがあり、低メモリ消費で知られています.現在、SQLiteはAndroidやiOSの開発に広く応用されている.この論文では、AndroidアプリケーションでSQLiteのパフォーマンスとリソース占有率を最適化する方法について主に説明します.
1,トランザクションの使用(Transaction)
デフォルトでは、INSERTのような基本的なデータベース操作を実行するなど、SQL文ごとに新しいトランザクションがパッケージされ、新しく作成されたトランザクションに格納されます.一度にデータベース操作を1回だけ操作する場合は、SQLite自身でトランザクション管理を行うのが賢明です.しかし、一度に大量の操作が必要な場合、例えばINSERT追加をループ呼び出した場合、これはオーバーヘッドが大きすぎるように見えます.各操作を再開し、書き込み、最後にjournalファイルを閉じます.このファイルは一時的にデータ操作を保存するための中間結果です.詳細はここを参照してください.
一連のSQL文の前後にBEGIN TRANSACTIONおよびEND TRANSACTIONのように明示的にトランザクションを使用すれば、上記の状況を回避できます.データを変更しない操作についても、同様にスピードアップできます(データベース操作では単一ペンの操作効率がロット操作よりはるかに低いように、SQL文でできることであれば、Cursorで操作することはできません).
注:トランザクションの開始に加えて、トランザクションのコミットとロールバックを担当する必要があります.
Androidアプリケーション開発では、BEGIN TRANSACTIONおよびEND TRANSACTIONと同様の方法で使用できます.
2.索引の使用
データベースでインデックスを使用していない場合は、ソートされていないデータ・テーブルでマッピング・クエリー(projection query)を使用して検索する場合、全シーケンス検索を実行することは避けられません.この場合、SQLiteを含むデータベースごとにインデックスが実行され、検索時間が短縮されます.
インデックスは、テーブル内のカラムまたはカラムの順序を維持します.これにより、テーブル全体をスキャンすることなく、値のセットにすばやくナビゲートできます.すべてのインデックス情報は独立したインデックステーブルに保存されるため、余分なスペース占有が発生しますが、特にデータベースで大量の読み取りと検索操作を行う場合、絶対物は値を超えます.
SQLiteは、プライマリ・キー(Primary Key)カラムを含むUNIQUEカラムごとにインデックスを自動的に作成します.また、CREATE INDEXで表示して作成することもできます.
注意:クエリーが複雑すぎて作成したインデックスが使用できない場合は、データベースの構造をよく考えてください.
3.Whereブランチでの修飾子の使用
SQL文のWhereを文字列でつづる場合は、SQLiteのquery操作を使用して'?で行ないます.次のようなメリットがあります.
a.SQLiteはこれらのクエリとインデックスをキャッシュするのに有利である.
b.SQLiteキャッシュの上限に達することを避けることができる.文字列を使用してWhereのクエリを結合すると、それぞれが異なるクエリとみなされ、キャッシュの上限に達しやすくなります.
c.不正なSQL注入を避けることができます.
転載は出典を明記してください.http://blog.csdn.net/horkychen
参照先:
1.SQLiteクエリのパフォーマンス最適化のポイント
2. Android SQLiteDatabase
3. Android SQLite性能分析
現在の作業と結びつけて,操作の最適化を発見し,以下の文章を翻訳してアーカイブすることができる.以下は本文です.
SQLiteには簡潔なSQLインタフェースがあり、低メモリ消費で知られています.現在、SQLiteはAndroidやiOSの開発に広く応用されている.この論文では、AndroidアプリケーションでSQLiteのパフォーマンスとリソース占有率を最適化する方法について主に説明します.
1,トランザクションの使用(Transaction)
デフォルトでは、INSERTのような基本的なデータベース操作を実行するなど、SQL文ごとに新しいトランザクションがパッケージされ、新しく作成されたトランザクションに格納されます.一度にデータベース操作を1回だけ操作する場合は、SQLite自身でトランザクション管理を行うのが賢明です.しかし、一度に大量の操作が必要な場合、例えばINSERT追加をループ呼び出した場合、これはオーバーヘッドが大きすぎるように見えます.各操作を再開し、書き込み、最後にjournalファイルを閉じます.このファイルは一時的にデータ操作を保存するための中間結果です.詳細はここを参照してください.
一連のSQL文の前後にBEGIN TRANSACTIONおよびEND TRANSACTIONのように明示的にトランザクションを使用すれば、上記の状況を回避できます.データを変更しない操作についても、同様にスピードアップできます(データベース操作では単一ペンの操作効率がロット操作よりはるかに低いように、SQL文でできることであれば、Cursorで操作することはできません).
注:トランザクションの開始に加えて、トランザクションのコミットとロールバックを担当する必要があります.
Androidアプリケーション開発では、BEGIN TRANSACTIONおよびEND TRANSACTIONと同様の方法で使用できます.
db.beginTransaction();
try{
for(int i =0; i< LENGTH ; i++,sequenceNum++)
{
// execute SQL
}
db.setTransactionSuccessful();// marks a commit
}
finally{
db.endTransaction();
}
2.索引の使用
データベースでインデックスを使用していない場合は、ソートされていないデータ・テーブルでマッピング・クエリー(projection query)を使用して検索する場合、全シーケンス検索を実行することは避けられません.この場合、SQLiteを含むデータベースごとにインデックスが実行され、検索時間が短縮されます.
インデックスは、テーブル内のカラムまたはカラムの順序を維持します.これにより、テーブル全体をスキャンすることなく、値のセットにすばやくナビゲートできます.すべてのインデックス情報は独立したインデックステーブルに保存されるため、余分なスペース占有が発生しますが、特にデータベースで大量の読み取りと検索操作を行う場合、絶対物は値を超えます.
SQLiteは、プライマリ・キー(Primary Key)カラムを含むUNIQUEカラムごとにインデックスを自動的に作成します.また、CREATE INDEXで表示して作成することもできます.
注意:クエリーが複雑すぎて作成したインデックスが使用できない場合は、データベースの構造をよく考えてください.
3.Whereブランチでの修飾子の使用
SQL文のWhereを文字列でつづる場合は、SQLiteのquery操作を使用して'?で行ないます.次のようなメリットがあります.
a.SQLiteはこれらのクエリとインデックスをキャッシュするのに有利である.
b.SQLiteキャッシュの上限に達することを避けることができる.文字列を使用してWhereのクエリを結合すると、それぞれが異なるクエリとみなされ、キャッシュの上限に達しやすくなります.
c.不正なSQL注入を避けることができます.
転載は出典を明記してください.http://blog.csdn.net/horkychen
参照先:
1.SQLiteクエリのパフォーマンス最適化のポイント
2. Android SQLiteDatabase
3. Android SQLite性能分析