【问题标题】:Sqlite3 query gets really slow under iOS 8.2在 iOS 8.2 下,Sqlite3 查询变得非常慢
【发布时间】:2015-03-13 13:39:47
【问题描述】:

我已经制作了一个可以在应用程序中使用 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;

}

【问题讨论】:

  • 您好,您找到此答案的确切解决方案了吗?

标签: ios sqlite ios8.2


【解决方案1】:

有几件事发生了变化:

这两个变化的组合很可能是您的性能问题的原因。虽然 NGPQ 可能会提高许多复杂查询的性能,但它会对一些复杂查询产生负面影响,例如您的(和我的!)。

为了解决您的问题,我会查看您的具体查询,看看您是否缺少任何可以提高性能的索引。使用EXPLAIN QUERY PLAN 可能会让您对正在发生的事情有所了解。

  • 很遗憾,除了 tweet 和一些技术论坛帖子的深度之外,我找不到更好的 iOS 更改来源。

【讨论】:

    【解决方案2】:

    看起来你的代码没问题,我只是在这里解决了同样的问题,更新了 SQLite 框架,并且在后台发生了一些变化。调试查询(EXPLAIN QUERY PLAN)我看到我的查询没有使用我的索引...只要确保这一点。

    【讨论】:

      【解决方案3】:

      我有同样的问题,只是对于一些查询。

      在旧查询中,在 FROM(派生表)内连接表中 ...

      我更改了顺序,在 FROM 表内连接(派生表)...

      我知道这很奇怪,但是查询很快

      【讨论】:

        【解决方案4】:

        我可能会迟到回答这个问题,但是 FWIW:我在一个复杂的、运行时生成的查询下遇到了一个非常相似的问题,我无法真正解决这个问题。它在所有设备和所有 iOS 版本上都运行得非常快,除非在 iOS 8.2 下运行。不用说,我们的客户为此抱怨了好几天。

        今天我找到了一个似乎可行的简单解决方案。不要链接到 sqlite3.dylibsqlite3.0.dylib。取而代之的是download SQLite 合并源代码,它由一个 C 文件和一个头文件组成,因此只需快速拖放到您的项目中即可。然后,替换所有的

        #import <sqlite3.h>
        

        通过

        #import "sqlite3.h"
        

        然后再次运行您的应用,它应该可以像在 iOS 8.1 和以前的版本上一样运行。

        【讨论】:

          猜你喜欢
          • 2020-11-21
          • 1970-01-01
          • 2020-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多