Основная производительность данных: NSP предикат сравнения объектов - PullRequest
8 голосов
/ 23 декабря 2011

Если моя модель Author NSManagedObject имеет атрибут authorID (определяется сервером), NSFetchRequest будет работать лучше, если NSPredicate фильтрует по authorID вместо полного Author объекта?Допустим, я получаю все Book NSManagedObject с определенным author.Какой predicateFormat лучше?

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

или

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

Какой лучший способ профилировать это?У меня есть тестирование Core Data, работающее с OCUnit (SenTestingKit).Есть ли в iOS что-то вроде модуля Ruby's Benchmark ?

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Возможно, стоит запустить ваше приложение с аргументом -com.apple.CoreData.SQLDebug 1, как подробно здесь .

После этого вы можете увидеть, выполняет ли Core Data один и тот же SQL в обоих случаях (при условии, что вы используете хранилище SQLite).

0 голосов
/ 23 декабря 2011

Первый (с использованием только Author), вероятно, будет быстрее, но только тестирование скажет вам наверняка.

Если вы выбираете (например, Book) объекты, которые имеют отношение к Author и вы используете предикат

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

SQLite может видеть, есть ли у таблицы слияния от Book до Author правильный первичный ключ для данного author.Другими словами, предикат превращается в проверку первичного ключа сущностей Author.CoreData все еще должен обращаться к таблице слияния.

Если вы используете

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

, тогда SQLite придется join таблицу слияния с фактической таблицей Author и затем сопоставлятьрезультирующий столбец authorID.Это было бы больше работы.И он сломался бы, если authorID не проиндексирован.

...