2011-12-22 15 views
5

Jeśli mój model AuthorNSManagedObject ma atrybut authorID (określona przez serwer), będzie NSFetchRequest wykonywać lepiej, gdyby NSPredicate filtry według authorID zamiast kompletnej Author obiektu? Powiedzmy, że pobieram wszystkie s przez pewien author. Który numer jest lepszy?Core Performance Dane: NSPredicate porównywaniu obiektów

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

lub

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

Jaki jest najlepszy sposób, żeby ten profil? Mam testowanie danych podstawowych współpracujące z OCUnit (SenTestingKit). Czy system iOS ma coś takiego jak Ruby's Benchmark module?

+0

Czy masz obiekt autorski pod ręką podczas pobierania? Jeśli miałbyś użyć obiektu Autor, zakładam, że musisz najpierw pobrać go, a następnie wykonać drugie żądanie książek przez tego autora (2 wycieczki do bazy danych). Jeśli masz już identyfikator, możesz uzyskać wyniki, których potrzebujesz, za pomocą jednej prośby o pobranie. – Rog

+0

To nie rozwiąże problemu, ale lepiej wiesz, że Dokumentacja Apple stwierdza, że ​​powinieneś używać "==", a nie tylko "=" podczas pisania predykatów. –

Odpowiedz

1

Być może warto uruchomić aplikację z argumentem -com.apple.CoreData.SQLDebug 1, jak szczegółowo here.

Można wtedy sprawdzić, czy Core Data realizuje ten sam SQL w obu przypadkach (zakładając, że korzystasz ze sklepu SQLite).

0

Pierwsza (przy użyciu tylko Author) byłaby prawdopodobnie szybsza, ale tylko testowanie powie Ci na pewno.

Jeśli fetch (np Book) obiektów, które mają związek z Author i użyć predykatu

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

SQLite mogą sprawdzić, czy tabela scalania z Book do Author ma prawo klucz podstawowy dla podanej author . Innymi słowy, predykat zamienia się w sprawdzanie klucza podstawowego encji Author. CoreData nadal jednak musi skonsultować się z tabelą scalania.

Jeśli używasz

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

następnie SQLite będzie musiał join ze stołu seryjnej z rzeczywistą Author tabeli, a następnie dopasować wynikowy authorID kolumnę. To byłoby więcej pracy. I ulegnie awarii, jeśli authorID nie jest indeksowany.

+0

Natknąłem się na to podczas debugowania podobnego predykatu; Nie mogę uzyskać predykatu opartego na obiekcie do pracy, używając tego samego formatu, jaki masz w pierwszym przykładzie. Sprawdzanie danych bezpośrednio w sqlite potwierdza, że ​​nie działa. Chciałbym dowiedzieć się więcej lub zrozumieć, dlaczego może nie działać – wkhatch

+0

Jak wygląda zapytanie SQL? Jakiego rodzaju inspekcje robisz? –