次のような非常に単純な CoreData セットアップになるはずです。
Track {
NSSet *artists;
NSSet *genres;
}
Artist {
NSSet *tracks;
}
Genre {
NSSet *tracks;
}
つまり、ここでの考え方は、 aTrack
が複数Genre
の とを持つことができるということArtist
です。Track
どちらの場合も に戻る逆の関係があります。
指定Artist
された の少なくとも 1 つを持つ のリストを取得しようとしています。次の述語を使用しています: .Track
Genre
[NSPredicate predicateWithFormat:@"ANY tracks in %@", genre.tracks]
ほとんどの場合、これは高速ですが、時々Genre
with 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 クエリの効率を改善するにはどうすればよいですか (これは機能します)。