我有一个非常简单的 CoreData 设置,如下所示:
Track {
NSSet *artists;
NSSet *genres;
}
Artist {
NSSet *tracks;
}
Genre {
NSSet *tracks;
}
所以这里的想法是,aTrack可以有多个Genres 和Artists。在这两种情况下都存在反比关系Track。
我正在尝试获取Artist至少有Track一个给定的 s 列表Genre。我正在使用以下谓词:[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks].
大多数时候这很快,但有时我有一个Genre10k+ Tracks。这会生成一个包含 10k+ 个变量的 SQL 查询……这需要很长时间才能运行。
我已经尝试了各种方法来避免这种情况,包括:
[NSPredicate predicateWithFormat:@"ANY %@ in tracks", genre.tracks]
[NSPredicate predicateWithFormat:@"SELF IN SUBQUERY(tracks, $t, %@ IN $t.genres)", genre]
[NSPredicate predicateWithFormat:@"(SUBQUERY(tracks, $t, %@ IN $t.genres).@count > 0)", genre];
可能还有一些我已经忘记了。这些中的每一个都可以编译,但不返回任何Artist对象。
我可以做些什么来提高我开始使用的 IN 查询的效率(哪个有效)?