2013-09-27 3 views
0
-(NSPredicate *) predicateForExactMatch 
{ 
    enum typeOfAutocompleteNew toc = [[self class] typeOfAutoComplete]; 
    NSPredicate * predictNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strNameofPlace)),self.strCurrentKeyword]; 
    NSPredicate * entryTypeNameMatch=[NSPredicate predicateWithFormat:@"%K==[cd]%@",NSStringFromSelector(@selector(strEntry)),@(toc)]; 
    NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]]; 
    return final; 
} 

Какой из них лучше?В Core Data, следует ли сначала поставить более ограничительный или менее ограничительный предикат?

NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[predictNameMatch,entryTypeNameMatch]]; 

или

NSPredicate * final = [NSCompoundPredicate andPredicateWithSubpredicates:@[entryTypeNameMatch,predictNameMatch]]; 

Здесь predictNameMatch, безусловно, гораздо более ограничительный характер. Максимум 1-2 - точное совпадение. entryTypeNameMatch соответствует 25% данных.

ответ

1

Я не могу дать вам точную ссылку, потому что я пишу это по телефону, но я совершенно уверен, что сначала было поставлено наиболее ограничительное предикат на каком-то сеансе основных данных WWDC.

+0

думаю тоже. Мне нужен кто-то, кто может убедиться, а потом объяснить почему. Похоже, что вторичный индекс действительно не работает или что у coredata нет составных индексов. –

2

Если это имеет значение, проверьте его и измерьте.

Я подозреваю, что вообщеMartin R правильно, но оптимизация производительности является темным искусством, и единственный способ быть уверенным, чтобы узнать ...

+0

Если вы сомневаетесь, спросите стек над потоком. –

1

Наиболее ограничительные предикаты должны прийти первым. В сложном предикате, подобном этому, предикаты оцениваются слева направо, и обработка заканчивается, как только результат известен. В вашем случае у вас есть логическое И, поэтому, если первый предикат является ложным, второй будет пропущен (поскольку он не нужен). Итак, если в первом предикате почти нет совпадений, вам почти не нужно будет оценивать второй.

Это точно такой же ярлык, который случается в if условном. Если вы используете if (a && b), а a является ложным, то b не будет оцениваться.

Смежные вопросы