我有一个非常简单的 CoreData 设置,如下所示:
Track {
NSSet *artists;
NSSet *genres;
}
Artist {
NSSet *tracks;
}
Genre {
NSSet *tracks;
}
所以这里的想法是,aTrack
可以有多个Genre
s 和Artist
s。在这两种情况下都存在反比关系Track
。
我正在尝试获取Artist
至少有Track
一个给定的 s 列表Genre
。我正在使用以下谓词:[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks]
.
大多数时候这很快,但有时我有一个Genre
10k+ 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 查询的效率(哪个有效)?