多対多の関係を持つ A と B の 2 つのエンティティがあります。
A エンティティには約 10,000 個のオブジェクトがあり、B エンティティには約 20 個のオブジェクトがあります。
基本的に、A オブジェクトは 1 つ以上の B オブジェクトに関連付けることができ、B オブジェクトはどの A オブジェクトに接続されているかを追跡します。これは、逆関係の設定で行われます。
A オブジェクトに関連しないすべての B オブジェクトを返したいだけです。私が使用しているフェッチはこれです:
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setIncludesPropertyValues:NO];
[fetch setEntity:[NSEntityDescription entityForName:@"B" inManagedObjectContext:context]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"aObjects.@count == 0"]];
return [context executeFetchRequest:fetch error:nil];
ただし、フェッチの実行には非常に長い時間がかかります。30秒。A オブジェクトが多数あるにもかかわらず、このフェッチはそれらとは関係なく、20 個の B オブジェクトをチェックする必要があるだけなので、これはわかりません。
フェッチがすべての B オブジェクトを返すように述語をコメントアウトすると、20 個のオブジェクトをフェッチするだけで期待どおり、フェッチは非常に高速になります。したがって、その述語がいくつかの A オブジェクトを巻き込んでいて、長い時間がかかっているように見えます。
なぜこれに時間がかかるのか、誰かが光を当てることができますか?
編集:
SQL デバッグ情報を取得しました。出力は次のとおりです。
CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK FROM ZTABLEVIEWOBJECT t0 WHERE ((SELECT COUNT(*) FROM ZTABLEVIEWOBJECT t1 JOIN Z_10BOBJECTS t2 ON t1.Z_PK = t2.Z_10AOBJECTS3 JOIN ZTABLEVIEWOBJECT t3 ON t2.Z_12BOBJECTS = t3.Z_PK WHERE (t0.Z_PK = t2.Z_12BOBJECTS) ) = ? AND t0.Z_ENT = ?)
CoreData: annotation: sql connection fetch time: 49.4198s
CoreData: annotation: total fetch execution time: 49.4240s for 0 rows.
エンティティ A とエンティティ B の両方が共通の TableViewObject エンティティを継承する (親を持つ) ことを追加する必要があります。これは、2 つの間で共通の値 (テーブル ビュー セクション名や並べ替え名など) を保持します。お役に立てれば!