次のような非常に単純な 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 クエリの効率を改善するにはどうすればよいですか (これは機能します)。