2012-06-23 18 views
6

Sto eseguendo un NSFetchRequest molto semplice per recuperare un'entità MessageObject. Ho solo 2000 oggetti messaggio e voglio recuperarli tutti. Tuttavia, per qualche strana ragione, la richiesta di recupero richiede più di 10 secondi!Il recupero dei dati core è estremamente lento

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]; 

E questo è tutto, questa è la mia prendere richiesta. Non sto nemmeno usando un predicato e ci vogliono più di 10 secondi. Sono assolutamente all'oscuro di ciò che potrebbe causare questo. Se qualcuno ha qualche idea o punto di partenza, per favore condividi.

Ho anche provato ad abilitare la registrazione di debug SQLite (-com.apple.CoreData.SQLDebug 1), ma ho appena ottenuto migliaia di righe di output da questo semplice recupero. È normale?

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) 

Io non sono molto familiare con la lettura di questo, ma sembra che recupera 2052 righe in .0067 secondi. Allora perché continua a fare più cose dopo? Non dovrebbe finire la richiesta se ha finito di recuperare le righe? È colpa dei dati o qualcosa del genere?

Inoltre, ho rimosso setFetchBatchSize, che ha eliminato le migliaia di righe, ma la richiesta di recupero richiede ancora molto tempo. Questa è l'uscita ottengo:

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 

Cosa c'è di strano è che a 20: 07: 26,763 a quanto pare dice ci sono voluti 1.4407 secondi per 4000 righe, ma non per un altro 9 secondi faccio ad avere l'uscita dicendo "finito il recupero "(che è un'istruzione NSLog visualizzata dopo [[self fetchedResultsController] performFetch:&error]) Che succede?

risposta

2

Rimuovi setFetchBatchSize.

Se l'intenzione è caricare tutto in una volta, è sufficiente rimuoverlo.

Inoltre, se avete bisogno di caricare tutti gli attributi, aggiungere:

fetchRequest.returnsObjectsAsFaults = NO; 

caricherà ogni entità e popolare gli attributi.

Si consiglia di caricare solo alcuni attributi, in modo da utilizzare questo per selezionare quello che vi serve:

fetchRequest.propertiesToFetch = ... 

ed il gioco è fatto.

+0

Beh, non voglio davvero prendere tutto, l'ho fatto per il gusto di testare. In realtà, avrò un predicato, ma solo per motivi di testing, volevo vedere quanto tempo ci sarebbe voluto per recuperare tutte le entità senza un predicato (perché con un predicato ci voleva troppo tempo). Ma dopo aver rimosso setFetchBatchSize, non ottengo più migliaia di righe di log SQL. Ma voglio mantenere il batchSize. – Snowman

+0

Se lo mantieni, Core Data dovrà risolvere migliaia di errori, quindi le richieste che vedi. Questo richiede molto tempo. –

+0

Ma non dovrebbe risolvere solo i guasti quando sono necessari? La mia tabella mostra solo 4 celle alla volta, quindi perché è in errore in migliaia di oggetti immediatamente? – Snowman

Problemi correlati