在iOS 8.2下,Sqlite3查询变得非常缓慢。

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;

}


你好,你找到这个问题的确切解决方案了吗? - Hariprasad
4个回答

2

有几件事情发生了变化:

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

为了解决您的问题,我建议您检查特定的查询,看看是否缺少可以改善性能的索引。使用EXPLAIN QUERY PLAN可能会让您了解正在发生的情况。

  • 遗憾的是,我找不到更好的iOS变化来源,除了这个推文和一些技术论坛帖子。

0

可能回答有点晚,但 FWIW: 我曾在一个复杂的运行时生成查询下遇到非常类似的问题,而且我不能对它进行太多操作。 它在所有设备和所有 iOS 版本上都运行得非常快,除了在 iOS 8.2 上运行时。 不用说,我们的客户抱怨了好几天。

今天我找到了一个看起来很有效的简单解决方案。不要链接到 sqlite3.dylib 或者 sqlite3.0.dylib。相反,download SQLite 并合并源代码,它包括一个 C 文件和一个头文件,因此只需将其快速拖放到项目中即可。 然后,替换掉你所有的

#import <sqlite3.h>

#import "sqlite3.h"

再次运行你的应用程序,它应该与 iOS 8.1 及之前版本一样正常工作。


0

看起来你的代码没问题,我刚刚在这里解决了同样的问题,SQLite框架已经更新,底层发生了一些变化。调试查询(EXPLAIN QUERY PLAN)时,我发现我的查询没有使用我的索引...请确保这一点。


0

我有同样的问题,只是针对某些查询。

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

我改变了顺序,在FROM表内联(派生表)...

我知道这很奇怪,但查询速度很快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接