2017-07-14 64 views
0

我一直试图调试CoreData提取速度非常慢,sqlite表只有1900个记录,它需要1.7秒才能执行提取。我已经完全排除了谓词,所以归结为排序。核心数据在提取方式中排序比在提取后排序慢?

如果我在提取请求中排序,则需要1.7秒。

// 1.7 seconds 
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"dateRaised" ascending:NO], 
           [NSSortDescriptor sortDescriptorWithKey:@"clientCreatedAt" ascending:NO]]; 
    items = [managedObjectContext executeFetchRequest:request error:nil]; 

如果我先获取然后做数组排序它需要0.2秒。

// 0.2 seconds 
    items = [managedObjectContext executeFetchRequest:request error:nil]; 
    items = [items sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"dateRaised" ascending:NO], 
               [NSSortDescriptor sortDescriptorWithKey:@"clientCreatedAt" ascending:NO]]]; 

这是为什么,我该怎么做才能改善CoreData获取?

+0

你有没有索引? (对于这个查询,复合索引将是最优的。) –

+0

我没有添加任何超出这些CoreData添加额外的索引自动。我会惊讶地发现1900行的索引很重要,但这只是一张小桌子。 – trapper

回答

0

我想通了。

我的对象有一个数据字段,它在某些情况下包含大量的数据。这绝对会杀死Sqlite中的排序。我不完全确定它为什么如此低效,但它很糟糕。

在Objective-C中获取之后进行排序要快得多。它只是重新排序对象引用,而没有实际移动任何数据。