2011-12-22 14 views
5

Si mi modelo AuthorNSManagedObject tiene un atributo authorID (determinado por el servidor), tendrá un NSFetchRequest un mejor rendimiento si los filtros NSPredicate por authorID en lugar de la completa Author objeto? Digamos que estoy buscando BookNSManagedObject s en un determinado author. ¿Cuál predicateFormat es mejor?Core Performance Data: NSPredicate comparar objetos

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

o

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

¿Cuál es la mejor manera de Profile? Tengo pruebas de datos centrales que funcionan con OCUnit (SenTestingKit). ¿IOS tiene algo así como Ruby's Benchmark module?

+0

¿Tiene el objeto de autor a mano cuando realiza la búsqueda? Si tuviera que usar el objeto Autor, supongo que primero debe buscarlo y luego realizar una segunda solicitud de los libros de ese autor (2 viajes a la base de datos). Si ya tiene la identificación, puede obtener los resultados que necesita con una solicitud de obtención. – Rog

+0

Esto no resolverá su problema, pero es mejor que sepa que la documentación de Apple establece que debe usar '==' y no solo '=' al escribir predicados. –

Respuesta

1

Puede valer la pena ejecutar su aplicación con un argumento de -com.apple.CoreData.SQLDebug 1, como se detalla here.

A continuación, podría ver si Core Data estaba ejecutando el mismo SQL en ambas circunstancias (suponiendo que esté utilizando una tienda SQLite).

0

El primero (usando solo Author) probablemente sea más rápido, pero solo las pruebas le dirán con certeza.

Si recoge los objetos (por ejemplo Book) que tienen una relación de Author y utiliza un predicado

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

SQLite puede ver si la tabla de fusión desde Book a Author tiene la clave principal razón para que, dada author . En otras palabras, el predicado se convierte en una verificación para la clave primaria de entidades Author. Sin embargo, CoreData aún tiene que consultar la tabla de fusión.

Si utiliza

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

continuación SQLite tendrá que join la tabla de combinación con el Author tabla real y luego igualar la columna resultante authorID. Eso sería más trabajo. Y se rompería si authorID no está indexado.

+0

Encontré esto mientras depuraba un predicado similar; No puedo hacer que un predicado basado en objetos funcione, usando el mismo formato que tiene en el primer ejemplo. La inspección de los datos directamente en sqlite confirma que no está funcionando. Me gustaría saber más o entender por qué no funciona – wkhatch

+0

¿Cómo se ve la solicitud SQL? ¿Qué tipo de inspección estás haciendo? –

Cuestiones relacionadas