【发布时间】: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”是否会影响速度。
-
谢谢 - 实际上确实尝试过。像你一样,认为它会产生很大的不同,但它并没有产生显着的差异。
-
这是一个好问题,但下次请以正确的方式格式化它。
标签: ios core-data subquery large-files nsfetchrequest