【问题标题】:Inefficient CoreData IN Query低效的 CoreData IN 查询
【发布时间】:2013-01-28 12:37:01
【问题描述】:

我已经完成了一个非常简单的 CoreData 设置,如下所示:

Track {
    NSSet *artists;
    NSSet *genres;
}

Artist {
    NSSet *tracks;
}

Genre {
    NSSet *tracks;
}

所以这里的想法是,一个Track 可以有多个Genres 和Artists。在这两种情况下,与 Track 之间存在反比关系。

我正在尝试获取Artists 的列表,其中至少有一个Track 和给定的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 查询的效率(哪个有效)?

【问题讨论】:

  • (SUBQUERY(tracks, $t, ANY t.genres = %@).@count > 0)", genre 呢?
  • 我们赢了!!谢谢,我花了几个小时没有尝试那种特殊的魔法组合。如果您将其输入为正确的回复,我会很乐意将其标记为答案。

标签: ios sql sqlite core-data nspredicate


【解决方案1】:

你可以使用

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

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

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 2020-05-03
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2020-12-04
    相关资源
    最近更新 更多