2011-12-22 14 views
5

Se il mio modello AuthorNSManagedObject ha un attributo authorID (determinato dal server), sarà un NSFetchRequest un rendimento migliore se i filtri di NSPredicateauthorID piuttosto che la completa Author oggetto? Diciamo che sto recuperando tutti gli BookNSManagedObject s da un certo author. Quale predicateFormat è migliore?Core Performance dati: NSPredicate confronto di oggetti

[NSPredicate predicateWithFormat:@"author = %@", anAuthor] 

o

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID] 

Qual è il modo migliore per il profilo di questo? Ho i test dei dati principali che funzionano con OCUnit (SenTestingKit). IOS ha qualcosa come Ruby's Benchmark module?

+0

Hai a portata di mano l'oggetto autore quando esegui il recupero? Se si dovesse utilizzare l'oggetto Autore, presumo che sia necessario prima recuperarlo e quindi eseguire una seconda richiesta per i libri da parte dell'autore (2 viaggi nel database). Se hai già l'id, puoi ottenere i risultati necessari con una richiesta di recupero. – Rog

+0

Questo non risolverà il problema, ma è meglio sapere che la documentazione Apple afferma che è necessario utilizzare '==' e non solo '=' durante la scrittura di predicati. –

risposta

1

Potrebbe valere la pena di eseguire la tua app con un argomento di -com.apple.CoreData.SQLDebug 1, come dettagliato here.

Si potrebbe quindi verificare se Core Data eseguisse lo stesso SQL in entrambe le circostanze (presupponendo che si stia utilizzando un negozio SQLite).

0

Il primo (utilizzando solo Author) sarebbe probabilmente più veloce, ma solo i test lo diranno di sicuro.

Se si recupera gli oggetti (ad esempio Book) che hanno un rapporto di Author e si utilizza un predicato

[NSPredicate predicateWithFormat:@"author = %@", anAuthor] 

SQLite possono vedere se la tabella merge Book-Author ha la chiave primaria giusta per quella data author . In altre parole, il predicato diventa un assegno per la chiave primaria delle entità Author. CoreData deve comunque consultare la tabella di fusione.

Se si utilizza

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID] 

poi SQLite dovrà join la tavola si fondono con la Author tabella effettiva e quindi abbinare il authorID colonna risultante. Quello sarebbe più lavoro. E si romperà se authorID non è indicizzato.

+0

Mi sono imbattuto in questo mentre eseguivo il debug di un predicato simile; Non riesco a far funzionare un predicato basato su oggetti, utilizzando lo stesso formato del primo esempio. Ispezionare i dati direttamente in sqlite conferma che non funziona. Mi piacerebbe saperne di più o capire perché potrebbe non funzionare – wkhatch

+0

Che aspetto ha la richiesta SQL? Che tipo di ispezione stai facendo? –

Problemi correlati