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

我已经制作了一个适用于app内部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 = %fs", executionTime); return retArray; 

}

有些事情发生了变化:

  • 在iOS 8.2中,sqlite从3.7.13升级到3.8.5 *
  • 在sqlite 3.8.0中,查询计划程序被替换为“ 下一代查询计划程序 ”

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

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

  • 遗憾的是,除了这条推文以及一些技术论坛post的深度之外,我找不到更好的iOS更改来源。

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

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

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

我更改了FROM表内连接(衍生表)中的顺序…

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

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

今天我发现了一个似乎有效的简单解决方案。 不要链接sqlite3.dylibsqlite3.0.dylib 。 相反, 下载 SQLite合并源代码,它包含一个C文件和一个标题,因此它只是对项目的快速拖放。 然后,替换你所有的

 #import  

通过

 #import "sqlite3.h" 

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