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

时间:2015-03-13 13:39:47

标签: ios sqlite ios8.2

我已经制作了一款适用于应用内部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 个答案:

答案 0 :(得分:2)

有些事情发生了变化:

这两项更改的组合可能是导致性能问题的原因。虽然NGPQ可能会提高许多复杂查询的性能,但它会对一些复杂的查询产生负面影响,比如你的(以及我的!)。

要解决您的问题,我会检查您的具体查询,看看您是否遗漏了可能会提高您的效果的任何索引。使用A可能会让您对正在发生的事情有所了解。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对于某些查询,我也遇到了同样的问题。

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

我在FROM table inner join(衍生表)中改变了顺序......

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

答案 3 :(得分:0)

我可能迟到了回答这个问题,但是FWIW:我在一个复杂的,运行时生成的查询中遇到了一个非常类似的问题,我无法解决这个问题。除了在iOS 8.2下运行外,它在所有设备和所有iOS版本上运行得非常快。毋庸置疑,我们的客户几天都抱怨它。

今天我找到了一个似乎有效的简单解决方案。请勿链接 sqlite3.dylib sqlite3.0.dylib 。相反,download SQLite合并源代码,由C文件和标题组成,因此只需快速拖动到您的项目即可。然后,替换所有

#import <sqlite3.h>

通过

#import "sqlite3.h"

再次运行你的应用程序,它应该像在iOS 8.1和以前的版本上一样工作。