这是我的第一个Core Data项目,我需要有关加快获取请求速度的建议。
我的核心数据模型包含2个实体Wells
和Fluids
。 Wells
有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上确实很慢)
获取
Wells
和Fluids
: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秒
通过子查询获取
Wells
和Fluids
:predicateWithFormat: @"(wellNumber == 1) AND (SUBQUERY(wellsToFluids, $x, ANY $x.text1 CONTAINS[c] stringToFind).@count !=0)"
3.2秒
从
Fluids
提取时添加的其他属性的时间不会改变,保持在一个恒定的3.2秒。还尝试从
Fluids
获取,然后使用关系回Wells
–但这并没有提高速度。有人可以给我一些改进读取设置的提示吗,或者仅仅是200万条记录的功能?
最佳答案
这里有一些提示可以实现您想要的。无论如何,您始终需要衡量您的更改以查看更改是否有效。这是一个反馈过程。改变和衡量。更改和衡量等。
beginwith
或endswith
而不是contains
这些只是提示。
我真的建议看看High Performance Core Data博客。有关如何实现此目标的视频,幻灯片和代码。 Matthew Morey 做得非常好。
此外,Apple Developer网站(您必须是成员(member))必须在 WWDC 2013视频中进行一个名为的 session 核心数据性能优化和调试( session 211),其中涉及性能。