这是我的第一个Core Data项目,我需要有关加快获取请求速度的建议。

我的核心数据模型包含2个实体WellsFluidsWells有50,000条记录,而Fluids有200万条记录。它们如下所示。

Wells
nams
relation
wellsToFluids

Fluids
text1, text2, etc.
relation
fluidsToWells

Wells上的提取请求非常快。对Wells的提取请求与通过Fluids关系通过复合谓词访问的wellsToFluids的数据结合起来很慢。而且,我在不同的谓词上看到了意外的提取时间。

我正在根据用户选择构建复合谓词。但基本上情况如下

搜索Wells:
predicateWithFormat: @"(wellNumber == 1)"

.001秒

在流体上的搜索:
predicateWithFormat: @"(ANY  wellsToFluids.text2 CONTAINS[c] stringToFind)"

1.3秒(在Mac模拟器上–在iPhone或iPad上确实很慢)

获取WellsFluids:
predicateWithFormat: @"(wellNumber == 1)  AND (ANY  wellsToFluids.text1 CONTAINS[c] stringToFind)"

3.2秒

获取Wells和多个Fluids属性:
predicateWithFormat: @"(wellNumber == 1)  AND (ANY  wellsToFluids.text1 CONTAINS[c] stringToFind) AND (ANY  wellsToFluids.text2 CONTAINS[c] stringToFind)"

6秒

将谓词的Fluids部分更改为子查询会产生怪异的结果。

使用子查询仅获取Fluids:
predicateWithFormat:@"(SUBQUERY(wellsToFluids, $x, ANY $x.text1 CONTAINS[c] stringToFind).@count !=0)"

12秒

通过子查询获取WellsFluids:
predicateWithFormat: @"(wellNumber == 1)  AND  (SUBQUERY(wellsToFluids, $x, ANY $x.text1 CONTAINS[c] stringToFind).@count !=0)"

3.2秒

Fluids提取时添加的其他属性的时间不会改变,保持在一个恒定的3.2秒。

还尝试从Fluids获取,然后使用关系回Wells –但这并没有提高速度。

有人可以给我一些改进读取设置的提示吗,或者仅仅是200万条记录的功能?

最佳答案

这里有一些提示可以实现您想要的。无论如何,您始终需要衡量您的更改以查看更改是否有效。这是一个反馈过程。改变和衡量。更改和衡量等。

  • 预取关系
  • 使用批处理
  • 首选beginwithendswith而不是contains
  • 必要时避免使用[cd]
  • 标准化字符串
  • ...

  • 这些只是提示。

    我真的建议看看High Performance Core Data博客。有关如何实现此目标的视频,幻灯片和代码。 Matthew Morey 做得非常好。

    此外,Apple Developer网站(您必须是成员(member))必须在 WWDC 2013视频中进行一个名为的 session 核心数据性能优化和调试( session 211),其中涉及性能。

    10-06 03:03