2013-12-09 40 views
3

这是我的第一个核心数据项目,我需要关于加快提取请求的建议。大数据集上的核心数据提取请求速度慢

我的核心数据模型包含2个实体,WellsFluidsWells有50,000条记录,而Fluids有200万条记录。他们看起来像以下。

Wells 
nams 
relation 
wellsToFluids 

Fluids 
text1, text2, etc. 
relation 
fluidsToWells 

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

我在构建基于用户选择的复合谓词。但基本情况是Wells以下

搜索:

predicateWithFormat: @"(wellNumber == 1)" 

0.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)[email protected] !=0)" 

12秒。

抓取上WellsFluids与子查询:

predicateWithFormat: @"(wellNumber == 1) AND (SUBQUERY(wellsToFluids, $x, ANY $x.text1 CONTAINS[c] stringToFind)[email protected] !=0)" 

3.2秒。

对于从Fluids获取的附加属性,时间不变,时间保持相当恒定的3.2秒。

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

有人可以给我一些改进获取设置的指针,或者它只是200万条记录的一个特征吗?

+0

文本匹配谓词(如CONTAINS)通常比简单的“数字== 1”慢得多,特别是如果使用[c]搜索(不区分大小写)。我会首先检查“任何wellsToFluids.text1 CONTAINS stringToFind”或“任何wellsToFluids.text1 == stringToFind”在速度上有所不同。 –

+0

谢谢 - 实际上确实尝试过。和你一样,认为它会产生很大的差异,但并没有产生显着的差异。 –

+0

这是一个很好的问题,但下次请以正确的方式格式化。 –

回答

5

这里有一些提示,以实现你想要的。无论如何,你总是需要衡量你的变化,看看他们是否有效。这是一个反馈过程。改变和衡量。改变和衡量等。

  • 预取的关系
  • 使用批量
  • 身高:beginwithendswith代替contains
  • 避免[CD]必要时
  • 正常化串
  • ...

这些只是提示。

我真的建议看看High Performance Core Data博客。有一个视频,幻灯片和代码如何实现这一目标。 马修莫雷做得非常好。

也是苹果开发者网站(你必须看它的成员),在WWDC 2013部影片,有一个会议要求核心数据性能优化和调试(会话211)其中谈到性能。

+0

感谢您的反馈意见。对不起格式 - 新的网站。下次会做得更好!你建议的博客很棒。 –

+0

@KathleenCollins没问题;)另见我的编辑。 –