查询中的CoreData效率低下

时间:2013-02-13 02:36:20

标签: ios sql sqlite core-data nspredicate

我有一个非常简单的CoreData设置,如下所示:

Track {
    NSSet *artists;
    NSSet *genres;
}

Artist {
    NSSet *tracks;
}

Genre {
    NSSet *tracks;
}

所以这里的想法是,Track可以有多个GenreArtist。在两种情况下都存在与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查询的效率(哪个有效)?

1 个答案:

答案 0 :(得分:3)

您可以使用

[NSPredicate predicateWithFormat:@"(SUBQUERY(tracks, $t, ANY t.genres = %@).@count > 0)", genre]

提供与原始谓词相同的结果,但避免使用许多参数构建查询。