Извлечение из категорий CoreData и Group By происходит очень медленно - PullRequest
0 голосов
/ 02 апреля 2012

Мне нужно получить около нескольких сотен записей из CoreData и сгруппировать их по category_id, чтобы поместить в разделы. Ниже приведен код для fetchedResultController

- (NSFetchedResultsController *)fetchedResultsController
     {
       if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
     }

    NSPredicate *predicate           = [NSPredicate predicateWithFormat:@"%d == mall_id",self.mallId.intValue];
    NSFetchRequest *fetch            = [[NSFetchRequest alloc] initWithEntityName:@"Shop"];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category_id" ascending:YES];
    NSArray *sortDescriptors         = [NSArray arrayWithObject:sortDescriptor];
    [fetch setPredicate:predicate];
    [fetch setFetchBatchSize:20];
    [fetch setSortDescriptors:sortDescriptors];
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch managedObjectContext:self.contextForDb sectionNameKeyPath:@"category_id" cacheName:@"root"];
    return self.fetchedResultsController;
}

извлечение занимает около 1-1,5 секунды, что недопустимо медленно для нескольких сотен записей. Я несколько дней пытался найти решение в Интернете, но не смог решить эту проблему с производительностью.

Я думаю, что горлышко бутылки - это группировка в базе данных.

Может ли кто-нибудь помочь, пожалуйста?

UPDATE

2012-04-02 17:57:08.872 SGMalls[186:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZADDRESS, t0.ZID, t0.ZLATITUDE, t0.ZLONGITUDE, t0.ZNAME, t0.ZPHONE, t0.ZUPDATED_TIME, t0.ZURL, t0.ZZIP FROM ZMALL t0 WHERE  t0.ZID = ? 
2012-04-02 17:57:08.875 SGMalls[186:707] CoreData: annotation: sql connection fetch time: 0.0030s
2012-04-02 17:57:08.877 SGMalls[186:707] CoreData: annotation: total fetch execution time: 0.0047s for 1 rows.
2012-04-02 17:57:09.040 SGMalls[186:707] CoreData: sql: SELECT 0, t0.Z_PK FROM ZSHOP t0 WHERE ? =  t0.ZMALL_ID ORDER BY t0.ZCATEGORY_ID
2012-04-02 17:57:09.390 SGMalls[186:707] CoreData: annotation: sql connection fetch time: 0.3496s
2012-04-02 17:57:09.391 SGMalls[186:707] CoreData: annotation: total fetch execution time: 0.3514s for 16 rows.
2012-04-02 17:57:09.395 SGMalls[186:707] CoreData: sql: SELECT t0.ZCATEGORY_ID, COUNT (DISTINCT  t0.Z_PK) FROM ZSHOP t0 WHERE ? =  t0.ZMALL_ID GROUP BY  t0.ZCATEGORY_ID ORDER BY t0.ZCATEGORY_ID
2012-04-02 17:57:09.741 SGMalls[186:707] CoreData: annotation: sql connection fetch time: 0.3458s
2012-04-02 17:57:09.743 SGMalls[186:707] CoreData: annotation: total fetch execution time: 0.3475s for 3 rows.
2012-04-02 17:57:09.748 SGMalls[186:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDETAIL, t0.ZID, t0.ZNAME FROM ZCATEG t0 WHERE  t0.ZID = ? 
2012-04-02 17:57:09.751 SGMalls[186:707] CoreData: annotation: sql connection fetch time: 0.0028s
2012-04-02 17:57:09.754 SGMalls[186:707] CoreData: annotation: total fetch execution time: 0.0061s for 1 rows.
2012-04-02 17:57:09.757 SGMalls[186:707] Title: icon_foodspecialties
2012-04-02 17:57:09.765 SGMalls[186:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDETAIL, t0.ZID, t0.ZNAME FROM ZCATEG t0 WHERE  t0.ZID = ? 
2012-04-02 17:57:09.767 SGMalls[186:707] CoreData: annotation: sql connection fetch time: 0.0022s
2012-04-02 17:57:09.769 SGMalls[186:707] CoreData: annotation: total fetch execution time: 0.0042s for 1 rows.
2012-04-02 17:57:09.773 SGMalls[186:707] Title: icon_supermarket
2012-04-02 17:57:09.782 SGMalls[186:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDETAIL, t0.ZID, t0.ZNAME FROM ZCATEG t0 WHERE  t0.ZID = ? 
2012-04-02 17:57:09.784 SGMalls[186:707] CoreData: annotation: sql connection fetch time: 0.0022s
2012-04-02 17:57:09.787 SGMalls[186:707] CoreData: annotation: total fetch execution time: 0.0046s for 1 rows.

Enable SQL Debugging возвращает это в консоли

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Вы уже устанавливали индексы, когда изначально создавалась база данных SQLite? После прочтения этого SO-Question я попытался установить индекс для свойства для уже существующей базы данных SQLite: индекс не был создан. Когда я удалил и переустановил приложение (сгенерировав новую SQLite-DB), этот индекс действительно был создан.

Возможно, вам следует попробовать удалить и переустановить. Или вы можете использовать такой инструмент, как SQLite Manager (или любой другой вариант), чтобы убедиться, что ваши индексы действительно такие, какими они должны быть.

1 голос
/ 02 апреля 2012

Есть ли у вашего магазина отношения? Если да, попробуйте удалить их или сверните их. NSFetchedResultsController извлекает также все связанные отношения, которые могут быть проблемой здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...