Рассмотрим следующие 2 предиката, фильтрующие через хранилище 5k + записей:
predicate1 = [NSPredicate predicateWithFormat:@"hidden == NO AND name BEGINSWITH[cd] %@", searchString];
predicate2 = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchString];
Я включил -com.apple.CoreData.SQLDebug
, чтобы увидеть время запроса выборки:
predicate1: 0.4728s
predicate2: 0.0867s
Я что-то упустил? Оба столбца проиндексированы. Почему добавление простой логической проверки так сильно замедляет запрос на выборку?
РЕДАКТИРОВАТЬ : по запросу вывод:
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZHIDDEN, t0.ZID, t0.ZNAME, t0.ZRANK FROM ZARTISTINDEX t0 WHERE ( t0.ZHIDDEN = ? AND ( NSCoreDataStringSearch( t0.ZNAME, ?, 393, 0) OR NSCoreDataStringSearch( t0.ZNAME, ?, 393, 0))) ORDER BY t0.ZRANK DESC LIMIT 14
Этот столбец ранг
также индексируется. Причина, по которой мне нужно, чтобы этот запрос был быстрее 0,5 с, заключается в том, что он используется для функции автозаполнения. Этот запрос выполняется каждый раз, когда значение некоторого текстового поля изменяется пользователем.
РЕДАКТИРОВАТЬ 2 : добавление дополнительной контекстной информации:
- (NSArray*)autocompleteSuggestions:(NSString*)searchString {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ArtistIndex" inManagedObjectContext:self.indexObjectContext];
[request setEntity:entity];
[request setFetchLimit:10];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hidden == NO AND (name BEGINSWITH[cd] %@ OR name BEGINSWITH[cd] %@)", searchString, [NSString stringWithFormat:@"the %@", searchString]];
[request setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"rank" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
NSArray *resultsArray = [self.indexObjectContext executeFetchRequest:request error:nil];
[request release];
return resultsArray;
}
Сущность ArtistIndex
имеет следующие атрибуты:
Edit 3 : вот полные выходные данные SQL для медленный запрос (предикат1) и быстрый запрос (предикат2) с com.apple.CoreData.SQLDebug
, установленным на 3. Более тщательное тестирование принесло мне следующий тест раз, что лучше, но все же имеет + 2x разницу и действительно имеет значение в контексте предложений автозаполнения. Или это разумная разница во времени выборки сейчас?
predicate1: 0.3772s
predicate2: 0,1633s