【问题标题】:CoreData sorting in fetch way slower than sorting after fetch?CoreData以获取方式排序比获取后排序慢?
【发布时间】:2017-12-19 00:31:37
【问题描述】:

我一直在尝试调试 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 提取?

【问题讨论】:

  • 你有索引吗? (对于这个查询,复合索引是最佳的。)
  • 除了那些 CoreData 自动添加的索引之外,我还没有添加任何额外的索引。我会惊讶地看到索引对 1900 行很重要,但那是一张很小的表。

标签: sqlite core-data nsfetchrequest


【解决方案1】:

我想通了。

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

在 Objective-C 领域中获取后的排序要快得多。它只是重新排序对象引用,而不实际移动任何数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多