5

アプリ内の sqlite データベースで動作するアプリを作成しました。iOS 8.2 より前では問題なく動作していましたが、更新後はクエリ メソッドの動作が約 100 倍 (!!!) 遅くなりました。この問題に関する情報を見つけようとしましたが、まだ何も見つかりませんでした。誰も同じ経験をしていますか?これが今まで完璧に機能した私の方法です。エラーや最適化の可能性はありますか?

ご協力いただきありがとうございます!

- (NSArray *)databaseContentWithQueryString:(NSString *)queryString {

NSDate *methodStart = [NSDate date];

NSMutableArray *retArray = [[NSMutableArray alloc] init];

sqlite3_stmt *statement;
if (sqlite3_prepare_v2(_database, [queryString UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        int columnCount = sqlite3_column_count(statement);
        NSMutableArray *valueArray = [[NSMutableArray alloc] init];
        NSMutableArray *keyArray = [[NSMutableArray alloc] init];
        for (int i=0; i<columnCount; i++) {
            int type = sqlite3_column_type(statement, i);
            char *name = (char *) sqlite3_column_name(statement, i);
            [keyArray addObject:[NSString stringWithFormat:@"%s",name]];
            int intVal;
            char *charVal;
            if (type == SQLITE_INTEGER) {
                intVal = sqlite3_column_int(statement, i);
                [valueArray addObject:[NSNumber numberWithInt:intVal]];
            }
            if (type == SQLITE_TEXT) {
                charVal = (char *) sqlite3_column_text(statement, i);
                [valueArray addObject:[NSString stringWithUTF8String:charVal]];
            }
            if (type == SQLITE_NULL) {
                intVal = 0;
                [valueArray addObject:[NSNumber numberWithInt:intVal]];
            }
        }
        NSDictionary *dict = [[NSDictionary alloc] initWithObjects:valueArray forKeys:keyArray];
        [retArray addObject:dict];
    }
    sqlite3_finalize(statement);
}

//sqlite3_close(_database);

NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f s", executionTime);

return retArray;

}

4

4 に答える 4

2

いくつかの点が変更されました。

これら 2 つの変更の組み合わせが、パフォーマンスの問題の原因である可能性があります。NGPQ は多くの複雑なクエリのパフォーマンスを向上させる可能性がありますが、あなたの (そして私の!) ようないくつかの複雑なクエリには悪影響を及ぼします。

あなたの問題に対処するために、特定のクエリを見直して、パフォーマンスを向上させる可能性のあるインデックスが欠落しているかどうかを確認します。を使用するEXPLAIN QUERY PLANと、何が起こっているのかについての洞察が得られる可能性があります。

  • 残念ながら、このツイートと技術フォーラムの投稿の詳細以外に、iOS への変更に関するより良い情報源を見つけることができません。
于 2015-05-18T14:30:37.670 に答える
0

一部のクエリについてのみ、同じ問題があります。

古いクエリでは、FROM(派生テーブル)の内部結合テーブルで...

FROMテーブルの内部結合(派生テーブル)で順番を変えたのですが…

私はそれが奇妙であることを知っていますが、クエリは高速です

于 2015-03-27T10:51:51.547 に答える
0

あなたのコードは問題ないようです。ここで同じ問題を解決しただけです。SQLite フレームワークが更新され、内部で何かが変更されました。クエリのデバッグ (EXPLAIN QUERY PLAN) クエリでインデックスが使用されていないことがわかりました。それを確認してください。

于 2015-03-13T20:09:35.943 に答える