2015-03-13 75 views
5

我制作了一个应用程序,可以在应用程序内部使用sqlite数据库。在iOS 8.2之前它工作正常,但更新后查询方法的工作速度大约慢了100(!!!)倍。我试图找到有关这个问题的信息,但我还没有找到任何东西。任何人都有同样的经历吗?这是我的方法,直到现在完美工作。你看到它里面有任何错误或优化的可能性吗?在iOS 8.2下,Sqlite3查询速度非常慢012

感谢您的帮助!

- (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; 

}

+0

嗨,你找到了这个答案的确切解决方案? – Hariprasad 2015-06-18 13:31:42

回答

0

看起来它是确定你的代码块,我只是解决同样的问题在这里,SQLite的框架进行了更新和引擎盖下的东西改变。调试查询(EXPLAIN QUERY PLAN)我看到我的查询没有使用我的索引...只是确保这一点。

0

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

在旧的查询

,在FROM(衍生表)内部联接表...

我改变了顺序,从表内连接(衍生表)...

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

0

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

今天我发现了一个简单的解决方案,似乎工作。请勿链接sqlite3.dylibsqlite3.0.dylib。相反,download SQLite合并源代码,它包含一个C文件和一个头文件,所以它只是一个快速拖放到您的项目。然后,替换您的

#import <sqlite3.h> 

所有

#import "sqlite3.h" 

,并再次运行你的应用程序,它应该是工作,就像在iOS 8.1及以前版本。

2

一对夫妇的事情发生了变化:

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

为了解决您的问题,我会审查您的具体查询,看看您是否错过了任何可能会提高您的表现的索引。使用EXPLAIN QUERY PLAN可能会让您对发生的事情有所了解。

  • 遗憾的是,除了这个tweet以及一些技术论坛帖子的深度,我找不到更好的iOS版本。