2015-03-13 1 views
5

Я создал приложение, которое работает с базой данных sqlite внутри приложения. До iOS 8.2 он работал нормально, но после обновления метод запроса работает примерно на 100 (!!!) раз медленнее. Я попытался найти информацию об этой проблеме, но пока ничего не нашел. Кто-нибудь имеет такой же опыт? Вот мой метод, который отлично работал до сих пор. Вы видите какие-либо ошибки или возможности оптимизации внутри?Sqlite3 запрос очень медленно под iOS 8.2

Благодарим за помощь!

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

ответ

0

Похоже, что это нормально ваш кусок кода, я просто решить ту же проблему здесь, рамки SQLite был обновлен и изменить что-то под капотом. Отладка запроса (EXPLAIN QUERY PLAN) Я видел, что мой запрос не использует мои индексы ... просто убедитесь в этом.

0

У меня такая же проблема, только для некоторых запросов.

в старом запросе, в FROM (дериват таблицы) внутренней соединительной таблице ...

Я изменил порядок, в из-за стола внутреннего соединения (дериват стол) ...

Я знаю, что это странно, но запрос быстрый

0

Возможно, я опоздал на это, но FWIW: У меня была очень похожая проблема в сложном запросе, создаваемом во время выполнения, с которым я действительно не мог справиться. Он работает очень быстро на всех устройствах и всех версиях iOS, кроме случаев, когда выполняется под iOS 8.2. Само собой разумеется, наши клиенты жаловались в течение нескольких дней об этом.

Сегодня я нашел простое решение, которое, кажется, работает. НЕ связывайтесь ни с sqlite3.dylib, ни sqlite3.0.dylib. Вместо этого, download исходный код альянса SQLite, который состоит из файла C и заголовка, так что это просто быстрый drag'n'drop для вашего проекта. Затем замените все ваши

#import <sqlite3.h> 

по

#import "sqlite3.h" 

И запустить приложение снова, он должен работать так же, как на прошивке 8.1 и предыдущие версии.

2

Пару вещей изменилось:

  • В прошивкой 8.2, SQLite был повышен с 3.7.13 до 3.8.5 *
  • В SQLite 3.8.0, планировщик запросов был заменен на " Next Generation Query Planner '

Комбинация этих двух изменений, вероятно, является причиной вашей проблемы с производительностью. Хотя NGPQ, вероятно, улучшит производительность многих сложных запросов, это будет иметь негативные последствия для нескольких сложных запросов, таких как ваш (и мой!).

Чтобы решить вашу проблему, я просмотрю ваш конкретный запрос, чтобы узнать, отсутствуют ли у вас какие-либо индексы, которые могут улучшить вашу производительность. Использование EXPLAIN QUERY PLAN, скорее всего, даст вам некоторое представление о том, что происходит.

  • К сожалению, я не могу найти лучший источник для изменения к прошивке, кроме этого tweet и глубины некоторых сообщений на форуме технологий.