我的多对多关系中的核心数据提取速度非常慢?

时间:2012-06-03 23:19:41

标签: iphone core-data nsfetchedresultscontroller

我有一个Core Data数据库,包含3个实体类型,Unit / Department / Document ..

单位/部门在部门方面有一对多,即一个单位可以有多个部门,但每个部门只能有一个单位。

每个文档可以是一个或多个单元和/或部门的一部分,我需要能够找到与所选单元或部门匹配的文档。单位ID可以是“1234”,该单位的部门ID可以是“123499”。请注意,部门ID始终是该单位的4个数字,然后另外2个描述该部门。

对于数据模型来说,问题是当我选择一个单元(而没有部门),并且需要列出该单元下的所有文档时,搜索应该返回属于该单元的所有文档和所有那个属于该单位所有部门的文件,并且该搜索用5000个文件占用4秒以上,我必须做错事。

我正在使用NSFetchedResultsController,这是我的谓词。

NSPredicate *predicate;
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Document"];   
[req setPropertiesToFetch:[NSArray arrayWithObjects:@"name",@"publisher",@"isFavourite", nil]];
 req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]; 
[req setFetchBatchSize:15];
predicate = [NSPredicate predicateWithFormat:@"ANY units.id == %@ || ANY departments.id BEGINSWITH[cd] %@",self.selectedUnit.id,self.selectedUnit.id];

我可以用另一种方式吗?我想知道我是否可以选择单位,然后通过Unit.documents代替,但后来我认为我的FetchController不需要,我需要将结果放在一个数组中,并先对它们进行排序(取出所有的Entitites) ,并且需要更长的时间)..

更糟糕的是,我还需要能够在以后的文档的Name属性中进行搜索,并且CONTAINS [cd]使搜索更慢,我很遗憾无法将单词拆分成单独的表,因为我需要能够用单词输入单词,也就是说,用户可以输入“结果”,搜索应该返回标题中某处有“结果”的所有文档,例如“NSFetchedResultControllers很酷”

如何让CONTAINS搜索表现更好,现在我只有5000个文档,但也可能是20000或更多。

有什么好主意,想法?我观看了很多WWDC核心数据视频,在Apple开发者网站上阅读了Core Data性能,我真的认为我已经以正确的方式完成了它,但也许我的模型都错了,我可以在SQL调试中看到,那里是很多时间用于连接表,我试图弄清楚如何使SQL更清洁。

非常感谢你 /雅各布

1 个答案:

答案 0 :(得分:0)

您认为CONTAINSBEGINSWITH显着降低查询速度是正确的。我有两个想法:

  1. 使用索引(我相信您可以从WWDC视频中了解到)。特别是对于CONTAINS的文本搜索,这应该是一个很大的性能提升。

  2. 根据您提到的特定谓词,我会尝试使用id的number属性。在您的方案中,您已经方便地按单位订购了ID。

  3. 谓词可能是这样的:

    NSNumber *bottom = [NSNumber numberWithInt:[self.selectedUnit.id intValue]*100];
    NSNumber *top = [NSNumber numberWithInt:([self.selectedUnit.id intValue]+1)*100];
    [NSPredicate predicateWithFormat:
       @"ANY units.id == %@ || ANY (departments.id > %@ AND departments.id < %@)",
       self.selectedUnit.id, bottom, top];