Iphone 核心数据:子查询性能问题

Iphone 核心数据:子查询性能问题,iphone,objective-c,core-data,subquery,aggregate-functions,Iphone,Objective C,Core Data,Subquery,Aggregate Functions,我一直在尝试看看是否有任何方法可以改进以下谓词的性能: [NSPredicate predicateWithFormat:@"A=%@ and SUBQUERY($self.words,$k,$k.keyword IN %@).@count==%d", <value for A>, keywordList, [keywordList count]]; [NSPredicate predicateWithFormat:@“A=%@和子查询($self.words,$

我一直在尝试看看是否有任何方法可以改进以下谓词的性能:

[NSPredicate predicateWithFormat:@"A=%@ and SUBQUERY($self.words,$k,$k.keyword IN %@).@count==%d", 
  <value for A>, 
  keywordList, 
  [keywordList count]];
[NSPredicate predicateWithFormat:@“A=%@和子查询($self.words,$k,$k.keyword IN%@)。@count==%d”,
, 
关键词列表,
[关键词列表计数];
我试图做的是返回一个数组的所有记录,其中包含的关键字都包含在提供的数组(关键字列表)中。我有一个大约2000条记录的小数据库。但是,每个实体的关键字范围为40-300个关键字。关键字表示为从一个到一个称为关键字的实体的对多关系。上面的查询有效,但在我的iPhone4上运行大约需要7秒钟。我想看看我能做些什么,把反应缩短到亚秒

谢谢,
迈克尔

我认为你在倒退处理这个问题。如果您有关键字,您应该搜索
关键字
对象,然后遍历它们的
A
关系,找到相关的
A
对象。然后检查关系集中的重叠

比如:

NSFetchRequest *fetch=//...set up fetch
[fetch setEntity:Keyword_entity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"keyword IN %@",keywords];
[fetch setPredicate:p];
NSArray *fetchedObj=//... execute fetch

NSMutableSet *inCommon=[NSMutableSet setWithCapacity:[fetchedObjs count]];
for (NSManagedObject *mo in fetchedObjs){
  if ([inCommon count]==0){
    [inCommon addObjects:[mo valueForKey:@"aRelationshipName"]];
  }else{
    [inCommon intersectSet:[mo valueForKey:@"aRelationshipName"]];
  }
}
inCommon
将包含一组共享所有关键字的所有唯一
a
对象。
更新:

作者:


这并不能完全解决问题 作为从 fetchedObjs的交集不是 对的这并不能保证这一切 “A”对象包含所有 提供的关键字

好吧,让我们再来一次。假设您有一个如下所示的数据模型:

A {
    keywords<<-->>Keyword.as
}

Keyword{
    keyword:string
    as<<-->>A.keywords
}

这并不能完全解决问题,因为从fetchedObjs的交集返回的结果是不正确的。它不能保证所有“A”对象都包含所有提供的关键字。事实上,返回的是一个空列表,整个过程实际上需要更长的时间

我的模型或之前的答案一定有问题。我没有得到我期待的结果。返回“a”列表的一种替代方法是返回“a”的ManagedObjects列表。[mo valueForKey:(NSString*)]返回关系的对象


注意:我最初匿名发布这个问题,以为我已经登录了,所以我似乎无法对任何人的答案发表评论

如果你只是查询一个给定的关键字,那么性能如何?我的意思是,你能重写谓词来做子查询作为主查询吗?我把你的其他帐户合并到你注册的帐户中,这样你就可以编辑问题并留下评论了。完成后请删除此答案。谢谢,欢迎来到Stack Overflow。谢谢。你最初的评论让我思考。我最终重塑了我的设计。我的搜索现在是多路径搜索。第一种方法扫描一个规范化的关键字表,并生成一组与“a”对象匹配的记录ID。第二次通过查询第一次请求中ID在集合中的所有“A”对象。现在在我的iPhone4上搜索时间为次秒。谢谢你的帮助!我最终删除了A和关键字之间的关系。这也为我解决了另一个问题,那就是加载。无需对关系建模,加载时间大大缩短。请更新我的当前情况。。。对于那些可能感兴趣或可能提供改进的人。。我的模型现在看起来是这样的:关键字和A不再通过关系连接。似乎当我在导入对象时使用关系导入数据时,导入时间会显著增加。每个关键字实体都有一个关键字和一个字符串,该字符串包含与关键字相关联的所有a记录标识符,并用“^”符号分隔。我没有将它们存储为一个集合,因为我不打算基于recordid进行搜索。我现在进行两次搜索。1) 获取与作为搜索输入传入的关键字匹配的所有关键字对象。创建一个集合,其中包含此搜索中所有记录ID的交集2)从1查询集合中的所有实体大约有18k个关键字,每个关键字大约有11个与其相关的对象。最大值为156。这使得我的搜索最多只需要0.8秒,这比我以前的搜索最多需要8秒有了巨大的改进
NSFetchRequest *keyWordFetch=//...set up fetch
[keyWordFetch setEntity:Keyword_entity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"keyword IN %@",keywords];
[keyWordFetch setPredicate:p];
NSArray *fetchedKeywords=//... execute keyWordFetch


NSFetchRequest *entityAFetch=//...set up fetch
[entityAFetch setEntity:A_entity];
NSPredicate *pred=[NSPredicate predicateWithFormat:@"ALL keywords IN %@", fetchedKeywords);
[entityAFetch setPredicate:pred];
NSArray *fetchedAs=//... execute fetch