2013-02-13 91 views
1

我有什麼應該是一個非常簡單的CoreData的設置,看起來像這樣:低效CoreData查詢

Track { 
    NSSet *artists; 
    NSSet *genres; 
} 

Artist { 
    NSSet *tracks; 
} 

Genre { 
    NSSet *tracks; 
} 

所以這裏的想法是,一個Track可以有多個Genre S和Artist秒。在兩種情況下,都有與Track相反的關係。

我試圖獲得一個Artist的列表,其中至少有一個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)[email protected] > 0)", genre]; 

,可能有一些更多的,我已經忘記了。每個這些編譯,但返回沒有Artist對象。

我可以做些什麼來改進我開始使用(它工作)的IN查詢的效率?

+1

'(SUBQUERY(tracks,$ t,ANY t.genres =%@)。@ count> 0)「,genre'? – 2013-02-13 03:55:25

+0

我們有一個贏家!!謝謝,我花了幾個小時沒有嘗試特定的組合如果你把它作爲正確答案輸入,我會很樂意將它標記爲答案。 – Tim 2013-02-13 04:50:54

回答

3

您可以使用

​​

可以得到相同的結果原來的謂語,但避免了建設有許多參數的查詢。