2012-06-23 18 views
6

エンティティMessageObjectをフェッチするために非常に基本的なNSFetchRequestを実行しています。私は2000のメッセージオブジェクトしか持っていません。私はそれらをすべて習得したいと思います。しかし、何らかの理由でフェッチ要求が10秒以上かかることがあります。コアのデータフェッチが極端に遅い

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
[fetchRequest setFetchBatchSize:5]; 

これがそれです。これが私のフェッチ要求です。私は述語を使っていないし、10秒以上かかる。私はこれを引き起こしている可能性について絶対に無知です。誰かがアイデアや出発点を持っている場合は、共有してください。

また、SQLiteのデバッグログ(-com.apple.CoreData.SQLDebug 1)を有効にしようとしましたが、この単純なフェッチから何千もの出力が得られます。それは普通ですか?

2012-06-22 19:39:59.171 myapp[81825:15e03] about to execute fetch 
2012-06-22 19:39:59.172 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK FROM ZMBNOTEOBJECT t0 ORDER BY t0.ZCREATEDATE DESC 
2012-06-22 19:39:59.178 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0061s 
2012-06-22 19:39:59.179 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0067s for 2052 rows. 
2012-06-22 19:39:59.179 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGLIKE, t0.ZISPENDINGREAD, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCREATEDATE DESC LIMIT 15 
2012-06-22 19:39:59.180 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0008s 
2012-06-22 19:39:59.181 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0018s for 15 rows. 
2012-06-22 19:39:59.182 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGLIKE, t0.ZISPENDINGREAD, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCREATEDATE DESC LIMIT 15 
2012-06-22 19:39:59.186 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0042s 
2012-06-22 19:39:59.187 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0049s for 15 rows. 
2012-06-22 19:39:59.187 myapp[81825:15e03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE, t0.ZISGLOBAL, t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGLIKE, t0.ZISPENDINGREAD, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZCREATEDATE DESC LIMIT 15 
2012-06-22 19:39:59.188 myapp[81825:15e03] CoreData: annotation: sql connection fetch time: 0.0008s 
2012-06-22 19:39:59.189 myapp[81825:15e03] CoreData: annotation: total fetch execution time: 0.0014s for 15 rows. 
... (thousands of more lines similar to above) 

これは読んでいないのですが、2052行を.0067秒でフェッチするようです。それでは、なぜそれは後でもっと続けていくのですか?行の取得が終了したら、要求は終了してはいけませんか?それはデータか何かをフォルトしていますか?

また、私はsetFetchBatchSizeを削除しました。これは何千もの行を削除しましたが、フェッチ要求はまだまだ時間がかかります。これは私が得る出力されます:07:26.763それは明らかにそれが4000行のためではなく、他の9秒1.4407秒かかったと言い、私が「言っ出力はフェッチ終了ですか奇妙な何

2012-06-22 20:07:25.316 myapp[8927:707] about to execute fetch 
2012-06-22 20:07:25.322 myapp[8927:707] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZAUTHOREMAIL, t0.ZAUTHORNAME, t0.ZCREATEDATE,t0.ZISLOCKED, t0.ZISNEW, t0.ZISPENDINGDELETE, t0.ZISPENDINGSYNC, t0.ZLASTUPDATED, t0.ZLOCALLYMODIFIEDDATE, t0.ZMAINIDEA, t0.ZMETALASTUPDATED, t0.ZNOTEID, t0.ZNUMBEROFCHILDREN, t0.ZPARENTAUTHOREMAIL, t0.ZPARENTNOTEID, t0.ZROOTAUTHOREMAIL, t0.ZROOTNOTEID, t0.Z4PENDINGADDNOTES, t0.Z4PENDINGREMOVENOTES FROM ZMBNOTEOBJECT t0 ORDER BY t0.ZCREATEDATE DESC 
2012-06-22 20:07:26.758 myapp[8927:707] CoreData: annotation: sql connection fetch time: 1.0891s 
2012-06-22 20:07:26.763 myapp[8927:707] CoreData: annotation: total fetch execution time: 1.4407s for 4000 rows. 
2012-06-22 20:07:35.967 myapp[8927:707] finished fetching 

は20時ということです"(これは[[self fetchedResultsController] performFetch:&error]の後に現れるNSLogステートメントです)どうしたのですか?

答えて

2

setFetchBatchSizeを削除します。

すべてを一度にロードすることを目的としている場合は、削除してください。また

、追加、すべての属性をロードする必要がある場合:

fetchRequest.returnsObjectsAsFaults = NO; 

それはすべてのエンティティをロードし、属性を移入します。

あなたが特定の属性のみをロードしたいので、あなたが必要なものを選択するために、これを使用することがあります。

fetchRequest.propertiesToFetch = ... 

すれば完了です。

+0

私は本当にすべてを取っておきたいとは思いません。私はテストのためにそれを行いました。実際には、私は述語を持ちますが、テストのためだけに、(述語があまりにも長くかかるので)述語なしですべての実体をフェッチするのにどれくらい時間がかかるかを見たいと思っていました。しかし、setFetchBatchSizeを削除した後、私はSQLログの何千もの行をもう取得しません。しかし、私はbatchSizeを保つ必要があります。 – Snowman

+0

これを保持すると、Core Dataは何千ものフォールトを解決する必要があります。これには時間がかかります。 –

+0

しかし、障害が発生したときだけ障害を解決するべきではありませんか?私のテーブルは一度に4つのセルしか表示しないので、なぜ何千ものオブジェクトにすぐにフォールディングしていますか? – Snowman

関連する問題