Предикат NSFetchRequest с проверкой BOOL - SLOW

Рассмотрим следующие 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 имеет следующие атрибуты:

  • id (int32)
  • name (string, indexed)
  • rank (int32, indexed)
  • hidden (BOOL, indexed)

Edit 3 : вот полные выходные данные SQL для медленный запрос (предикат1) и быстрый запрос (предикат2) с com.apple.CoreData.SQLDebug , установленным на 3. Более тщательное тестирование принесло мне следующий тест раз, что лучше, но все же имеет + 2x разницу и действительно имеет значение в контексте предложений автозаполнения. Или это разумная разница во времени выборки сейчас?

predicate1: 0.3772s
predicate2: 0,1633s

6
задан samvermette 15 July 2011 в 04:20
поделиться