我有一个非常简单的CoreData设置,如下所示:
Track {
NSSet *artists;
NSSet *genres;
}
Artist {
NSSet *tracks;
}
Genre {
NSSet *tracks;
}
所以这里的想法是,Track
可以有多个Genre
和Artist
。在两种情况下都存在与Track
的反比关系。
我正在尝试获取至少有Artist
个给定Track
的{{1}}列表。我正在使用以下谓词:Genre
。
大部分时间这都很快,但有时我的[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks]
有10k + Genre
。这会生成一个带有10k +变量的SQL查询...这需要很长时间才能运行。
我已经尝试过各种各样的事情来避免这种情况,包括:
Tracks
可能还有一些我已经忘记了。这些中的每一个都编译,但不返回[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];
个对象。
我可以做些什么来提高我开始使用的IN查询的效率(哪个有效)?
答案 0 :(得分:3)
您可以使用
[NSPredicate predicateWithFormat:@"(SUBQUERY(tracks, $t, ANY t.genres = %@).@count > 0)", genre]
提供与原始谓词相同的结果,但避免使用许多参数构建查询。