我正在为使用coredata作为其持久性存储的iphone的企业ios应用程序工作。我们有几个核心数据实体,其中一个有30~字段。我的数据集超过了这30个字段实体中的45,000个。
我需要构建一个查询,其中我的搜索字符串可以匹配对象上的12个不同字段之一。我的NSPredicate基本上是(property == $ A)||的大鼠窝(otherproperty == $ A)...等等,其中$ A是我的搜索字符串。
我们刚刚开始调整性能,因为它非常糟糕。我们应该做些明显的事吗?是否更好地使用复合谓词并且每个子谓词都是(property == $ A)?
思考?提前谢谢。
我的(部分)解决方案 - 我观看了一些关于核心数据的wwdc视频,基本上就像Apple所说的那样。这是为了创建从我的真实对象到另一个对象的关系来表示搜索令牌。这个新的搜索令牌实体有两个字段 - 标记和权重。当我将主要对象插入coredata时,我给他一组这些搜索令牌。我想查询的每个字段有一个搜索令牌,令牌属性的内容是某种规范化(全部小写)数据。然后我的谓词只是“任何searchTokens.token开头%@”。所以现在我们只是在索引字段上搜索一个表,我们不必在where子句的右侧进行任何扩展。 Coredata真的像这样快速搜索。我做的唯一另一件事是在ifReloadTableForSearchString中放置一个NSTimer,只在1秒钟不活动后触发搜索。
答案 0 :(得分:3)
使用复合谓词会得到与||
的长字符串相同的结果,所以不会,这对你没用。
可能有助于优化谓词的顺序。它们从左到右进行评估,一旦结果已知,评估就会停止。如果你有一长串逻辑OR,并且第一个是真的,那么它们的其余部分是什么并不重要。这些谓词甚至都不会被评估。
因此,如果您可以合理地预期某些属性比其他属性更可能匹配,请将它们移到列表的前面。如果几乎所有时间都是YES,请将其作为第一个。
此外,如果这些谓词中的任何一个是数字,则将它们移向行的前面。数字比较比字符串比较快得多,因此任何返回YES的数字检查都会让您跳过以下任何字符串比较。