2011-10-05 4 views
0

저는 NSFetchedResultsController를 사용하여 일부 검색 결과를 UITableView에 표시하고 있습니다. 검색 결과는 다음 술어에 의해 요청됩니다.성능이 좋지 않습니다. 핵심 데이터 CONTAINS 조건부가 있습니다.

[NSPredicate predicateWithFormat:@"(plainText CONTAINS %@)", _searchString] 

검색이 수행되는 엔티티에는 약 25.000 개의 개체가 있습니다. plainText 속성에는 각각 약 700 단어의 문자열 값이 들어 있습니다.

이 검색에는 너무 느린 약 20 초가 소요됩니다.

성능을 최적화 할 수있는 방법이 있습니까?

WWDC 2010 세션 137에서 CONTAINS 사용을 피하기 위해 키워드를 별도의 엔티티로 정규화하는 방법에 대해 살펴 보았습니다. 이것은 그것을 향상시키는 방법입니다, 오직 700 개의 키워드가 있습니다. 그것을 700 x 25.000 = 17.500.000 키워드로 만드십시오. 나는 그것을 향상시킬 것입니다. 나도 해봐야 할까?

답변

3

문자열에 대해 25,000 개의 항목에서 700 단어 속성을 검색하면 실제로 느려집니다. 예. 귀하의 wwdc 아이디어는 정확합니다 - 하나의 '키워드'인 별도의 엔티티를 만들고 싶으면 엔티티와의 관계가 많을 것입니다. 이렇게하면 키워드 항목 하나를 매우 빨리 찾은 다음 2 만 5 천 개 항목을 신속하게 찾을 수 있습니다. 이렇게하면 매우 긴 문자열을 모두 검색하지 않아도됩니다.

tldr; 예, 시도해야합니다

+0

아이디어는 실제로 매우 기능적이지만 데이터베이스의 크기가 중요한지 여부에주의해야합니다.이 방법은 크기가 상당히 커질 것이기 때문에주의해야합니다. – Craimasjien

+0

시도 할 때까지 알 수 없습니다. 각 키워드는 한 번 존재하므로 크기가 줄어들 수 있습니다. 관계형 테이블은 엔티티의 pk와 키워드의 pk를 가지므로 각 엔티티에 대해 약 700 * 2 * sizeof (기본 키)를 저장합니다. 하지만 당신은 700 * (단어의 평균 길이) 없애 버릴거야. 나는 그것이 단지 세탁에 관한 것일 것 같았습니다. – Colin

+0

안녕하세요 콜린, 답변 주셔서 감사합니다. Part 엔티티 (원래 텍스트를 포함하고있는)와 다 대다 관계로 Keyword 엔티티를 만들었습니다. 이제 모든 쿼리 된 키워드가 포함 된 부품을 가져 오는 가장 빠른 쿼리가 필요합니다. 나는 술어 (키워드 == "testword \"와 단어 = \ "testword2 \")를 키워드 엔티티에 NSFetchRequest로 시도했지만 키워드를 빨리 얻었습니다. 그런 다음 키워드를 반복하고 부분을 가져 오는 경우에만 시간이 오래 걸립니다. 이 작업을 수행하는 더 빠른 방법을 알고 있습니까? –

관련 문제