我制作了一个可在应用程序内使用 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 8.2中,sqlite从3.7.13升级到3.8.5 *
- 在 sqlite 3.8.0 中,查询计划器被替换为 'Next Generation Query Planner '
这两项更改的组合可能是导致性能问题的原因。虽然 NGPQ 可能会提高许多复杂查询的性能,但它会对一些复杂查询产生负面影响,例如您的(和我的!)。
为了解决您的问题,我会检查您的特定查询,看看您是否缺少任何可以提高性能的索引。使用 EXPLAIN QUERY PLAN
可能会让您深入了解正在发生的事情。
- 遗憾的是,除了这个 tweet,我找不到更好的 iOS 更改资源。以及一些技术论坛帖子的深度。
关于ios - Sqlite3 查询在 iOS 8.2 下变得非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29033730/