在我的多对多关系中,核心数据的获取速度非常慢



我有一个核心数据数据库,其中包含 3 种实体类型,单位/部门/文档。

单位

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

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

对于数据模型来说,问题是当我选择一个单位(而不是部门)并需要列出该单位下的所有文档时,搜索应返回属于该单位的所有文档以及属于该单位下所有部门的所有文档,并且该搜索需要 4 秒以上,其中包含 5000 个文档, 我一定做错了什么。

我正在使用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很酷"

怎样才能使包含搜索性能更好,现在我只有 5000 个文档,但也可能是 20000 个或更多。

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

谢谢/雅 各

您假设CONTAINSBEGINSWITH正在显着减慢查询速度是正确的。我有两个想法给你:

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

  2. 对于您提到的特定谓词,我会尝试使用 id 的 number 属性。在您的方案中,您已经方便地按单位对 ID 进行了排序。

然后,谓词可以是这样的:

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];

最新更新