FMDB - улучшить скорость FMResultSet

Этот код выполняется очень долго. У меня около 100 000 записей. Каждый шаг занимает примерно одинаковое количество времени... получить результат из FMResultSet и прочитать его в 3 массива. Я попытался использовать два оператора select. Один, чтобы получить количество результатов, а затем выделить эту сумму в mutableArray. Нет разницы в производительности. Есть предложения по улучшению скорости?

FMResultSet *results = [database executeQuery:@"SELECT FriendlyName, Serial, Barcode FROM Inventory, Company WHERE Inventory.friendlyName <> '' AND Company.CompanyID = Inventory.companyID AND Company.CompanyName = ?", selectedCompany];

arrayFriendlyName =[[NSMutableArray alloc]init];
arraySerial = [[NSMutableArray alloc]init];
arrayBarcode = [[NSMutableArray alloc]init];


while([results next]) {

    [arrayFriendlyName addObject:[results stringForColumn:@"FriendlyName"]];
    [arrayBarcode addObject:[results stringForColumn:@"Barcode"]];
    [arraySerial addObject:[results stringForColumn:@"Serial"]];

}

[database close];

person CrazyGoose    schedule 19.02.2014    source источник
comment
сколько времени это занимает и вредно ли это для пользователя? Я считаю, что 100000 записей замедляют процесс. Можете ли вы отправить задачу в фоновом режиме?   -  person Volker    schedule 20.02.2014
comment
Множественный выбор, конечно, ничего не даст вам. Если вы не хотите вешать свой поток пользовательского интерфейса, оптимально вы можете выполнить задачу в какой-то фоновой очереди, как сказал @Volker   -  person Ayan Sengupta    schedule 20.02.2014
comment
Кстати, а зачем вам сразу 1000 000 записей? почему бы вам не лениво загружать записи, когда это необходимо, иначе это может создать серьезную угрозу производительности вашего приложения?   -  person Ayan Sengupta    schedule 20.02.2014
comment
Всего это занимает около 23 секунд.   -  person CrazyGoose    schedule 20.02.2014
comment
Он загружает 100 тысяч записей, чтобы их можно было искать и просматривать с помощью панели поиска. Это приложение для инвентаризации.   -  person CrazyGoose    schedule 20.02.2014


Ответы (1)


В зависимости от структуры вашей базы данных любая объектно-ориентированная оболочка вокруг sqlite может быть довольно медленной, когда речь идет о тысячах строк. Вы можете попытаться ускорить его, непосредственно обратившись к базе данных sqlite без использования какой-либо объектно-ориентированной оболочки. Поскольку вам не нужны никакие отношения (по крайней мере, в вашем примере кода), вы не потеряете никакой соответствующей функциональности - и это будет настолько быстро, насколько это возможно.

Как всегда, Рэй Вендерлих — хороший ресурс для ознакомления: http://www.raywenderlich.com/913/sqlite-tutorial-for-ios-making-our-app

Если вы еще этого не сделали, вы также можете посмотреть, установлены ли ваши индексы правильно для вашего запроса - поскольку вы объединяете две таблицы, отсутствие индексов в объединенных столбцах может серьезно повлиять на вашу производительность.

person TheEye    schedule 19.02.2014