SQLite は驚くほど高速です。450 万レコードのテスト テーブルには、次のような構造があります。
CREATE TABLE testtable (numericid INTEGER PRIMARY KEY, testtext TEXT);
これは、numericid (0、1、....) の増加する値と testtext の文字列で埋められます。
すべての挿入をアトミックに行うと、MacBook Pro (2009) で 1 時間 42 分かかりました。結果の SQLite ファイルのサイズは 94 MB です。
iOS アプリ内では、データベースは viewDidLoad メソッドで開かれます。次のような単純なボタン トリガー データベース クエリ:
- (void)btnPressed:(UIButton *)sender{
NSLog(@"btn pressed, start");
sqlite3_stmt *statement = nil;
NSString *querystring;
querystring= [NSString stringWithFormat:@"SELECT * FROM testtable WHERE numericid = 2571312;"];
const char *sql = [querystring UTF8String];
NSLog(@"sql is: %s", sql);
if (sqlite3_prepare_v2(dbConnection, sql, -1, &statement, NULL)!=SQLITE_OK){
NSLog(@"sql problem occured with: %s", sql);
NSLog(@"%s", sqlite3_errmsg(dbConnection));
}
else
{
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *numericid = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
NSString *testtext = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
NSLog(@"%@",[NSString stringWithFormat:@"%@ (%@)", numericid, testtext]);
} // while
}
sqlite3_finalize(statement);
NSLog(@"btn pressed, finished");
}
次の出力が得られます。
2012-08-10 17:51:36.734 DBQueryTest[28462:707] Database Successfully Opened
2012-08-10 17:51:39.083 DBQueryTest[28462:707] btn pressed, start
2012-08-10 17:51:39.087 DBQueryTest[28462:707] sql is: SELECT * FROM testtable WHERE numericid = 2571312;
2012-08-10 17:51:39.099 DBQueryTest[28462:707] text2571312 (2571312)
2012-08-10 17:51:39.102 DBQueryTest[28462:707] btn pressed, finished
したがって、クエリは 19 ミリ秒未満で完了します。これは、numericid のいくつかの値で再現できましたが、統計的評価のために完全に無作為化されたテストは実行していません。
結論: このテスト セットアップは要件を満たしています。SQLite は間違いなく進むべき道です。
アップデート:
100000 個のキー値を使用したクイック ランダム アクセス テストにより、最初の結果が検証されます。SQL ステートメント文字列の作成と時間のかかる NSLog 出力を時間測定から除外すると、平均データベース クエリ時間は次のように 1 桁低下します。
平均クエリ時間: 1.8 ミリ秒
平均偏差: 0.4 ミリ秒
最大クエリ時間: 25.9 ミリ秒
最小クエリ時間: 0.6 ミリ秒