大型数据集上的核心数据获取请求缓慢
Posted
技术标签:
【中文标题】大型数据集上的核心数据获取请求缓慢【英文标题】:Core Data Fetch requests slow on large data set 【发布时间】:2013-12-09 02:14:50 【问题描述】:这是我的第一个 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
fetch 添加的其他属性的时间不会改变,保持在相当恒定的 3.2 秒。
还尝试从Fluids
获取,然后使用与Wells
的关系——但这并没有提高速度。
有人可以给我一些关于改进提取设置的建议吗?或者它只是 200 万条记录的一个功能?
【问题讨论】:
文本匹配谓词(例如 CONTAINS)通常比简单的“数字 == 1”慢得多,特别是如果您使用 [c] 进行搜索(不区分大小写)。我将首先检查“ANY wellsToFluids.text1 CONTAINS stringToFind”或“ANY wellsToFluids.text1 == stringToFind”是否会影响速度。 谢谢 - 实际上确实尝试过。像你一样,认为它会产生很大的不同,但它并没有产生显着的差异。 这是一个好问题,但下次请以正确的方式格式化它。 【参考方案1】:这里有一些提示可以实现您想要的。无论如何,您总是需要衡量您的更改以查看它们是否有效。这是一个反馈过程。改变和衡量。变化和测量等等。
预取关系 使用批次 首选beginwith
或endswith
而不是contains
必要时避免 [cd]
规范化字符串
...
这些只是提示。
我真的建议看看High Performance Core Data 博客。有关于如何实现这一点的视频、幻灯片和代码。 马修·莫雷做得非常好。
Apple 开发者网站(您必须是会员才能观看)在 WWDC 2013 视频 中有一个名为 Core Data Performance Optimization and Debugging (session 211) 的会话> 谈论性能。
【讨论】:
感谢您的反馈。抱歉格式化 - 新网站。下次会做的更好!!你推荐的博客很棒。以上是关于大型数据集上的核心数据获取请求缓慢的主要内容,如果未能解决你的问题,请参考以下文章
基于条件的 2 个大型数据集上的模糊模糊字符串匹配 - python