我有 2 个实体,A 和 B,它们具有多对多关系。
A 实体有大约 10,000 个对象,B 有大约 20 个对象。
基本上,A 对象可以与一个或多个 B 对象相关,并且 B 对象会跟踪它们所连接的 A 对象。这是通过反向关系设置完成的。
我只是希望返回与 A 对象无关的每个 B 对象。我正在使用的获取是这样的:
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setIncludesPropertyValues:NO];
[fetch setEntity:[NSEntityDescription entityForName:@"B" inManagedObjectContext:context]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"aObjects.@count == 0"]];
return [context executeFetchRequest:fetch error:nil];
但是,获取执行需要很长时间,大约。30秒。这个我不明白,因为虽然有大量的A对象,但是这个fetch跟他们无关,只需要检查20个B对象。
如果我注释掉谓词以使 fetch 返回所有 B 对象,那么 fetch 非常快,正如您所期望的仅获取 20 个对象。因此,该谓词似乎涉及一些 A 对象并导致它花费很长时间!
任何人都可以解释为什么这需要这么长时间吗?
编辑:
我有 SQL 调试信息,输出如下:
CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK FROM ZTABLEVIEWOBJECT t0 WHERE ((SELECT COUNT(*) FROM ZTABLEVIEWOBJECT t1 JOIN Z_10BOBJECTS t2 ON t1.Z_PK = t2.Z_10AOBJECTS3 JOIN ZTABLEVIEWOBJECT t3 ON t2.Z_12BOBJECTS = t3.Z_PK WHERE (t0.Z_PK = t2.Z_12BOBJECTS) ) = ? AND t0.Z_ENT = ?)
CoreData: annotation: sql connection fetch time: 49.4198s
CoreData: annotation: total fetch execution time: 49.4240s for 0 rows.
我应该补充一点,实体 A 和实体 B 都继承(具有父级)一个通用 TableViewObject 实体,该实体拥有两者之间的通用值(例如表视图部分名称和排序名称等)。希望这可以帮助!