我使用iOS 4.3.2跟踪在iPad上运行的Core Data抓取请求。
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"feed.account.name == %@ AND feed.feedType == %@", accountName,feedType];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date"
ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
fetchedResultsController=[self createFetchedResultsController:@"RssFeedItem" predicate:predicate sortDescriptors:sortDescriptors];
[fetchedResultsController.fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"url",@"headline",@"isRead",@"origin",@"originId",@"date",nil]];
[fetchedResultsController.fetchRequest setFetchLimit:500];
[fetchedResultsController setDelegate:self];
[fetchedResultsController performFetch:&error];
return [fetchedResultsController fetchedObjects];
我在SQLite数据库中为RssFeedItem表提供了大约688行数据,在所有其他表中有少于100行。使用调试日志记录将该查询记录为:
CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, t0.ZURL, t0.ZHEADLINE, t0.ZISREAD, t0.ZORIGIN,
CoreData: annotation: sql connection fetch time: 3.3854s
CoreData: annotation: total fetch execution time: 3.4178s for 688 rows.
它运行速度非常慢(超过3秒)。我有所有必需的搜索字段和排序字段的索引。我假设也许2路连接使它变慢,但不确定为什么它会那么慢。有没有办法优化这个代码或查询,或者还有什么我应该看看?
答案 0 :(得分:2)
我想减慢查询速度的行是
[fetchedResultsController.fetchRequest setPropertiesToFetch:[NSArray
arrayWithObjects:@"url",@"headline",@"isRead",@"origin",@"originId",@"date",nil]];
和
[fetchedResultsController.fetchRequest setFetchLimit:500];
我很好奇,为什么你需要一次获取所有这些属性(和500个项目)?
答案 1 :(得分:1)
这看起来有点慢。我不知道这是否会产生巨大的速度差异,但它应该有所帮助,修改你的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"feed.feedType == %@ AND feed.account.name == %@", feedType, accountName];
您希望首先放置最便宜的条件,以便在所有情况下都不必检查更昂贵的条件。检查帐户名称时发生的连接要贵得多。此外,根据Feed类型值的样子,将它切换为整数可能会更快(我假设它当前是一个字符串,因为它是一个对象)。