1

次のような非常に単純な CoreData セットアップになるはずです。

Track {
    NSSet *artists;
    NSSet *genres;
}

Artist {
    NSSet *tracks;
}

Genre {
    NSSet *tracks;
}

つまり、ここでの考え方は、 aTrackが複数Genreの とを持つことができるということArtistです。Trackどちらの場合も に戻る逆の関係があります。

指定Artistされた の少なくとも 1 つを持つ のリストを取得しようとしています。次の述語を使用しています: .TrackGenre[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks]

ほとんどの場合、これは高速ですが、時々Genrewith 10k+がありTracksます。これにより、10,000 以上の変数を含む 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 クエリの効率を改善するにはどうすればよいですか (これは機能します)。

4

1 に答える 1

3

使用できます

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

これにより、元の述語と同じ結果が得られますが、多くのパラメーターを使用してクエリを作成することは避けられます。

于 2013-02-13T05:17:17.727 に答える