2011-10-05 89 views
0

我正在使用NSFetchedResultsController在UITableView中顯示一些搜索結果。搜索結果由以下謂詞請求:性能不佳核心數據CONTAINS謂詞

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

搜索正在經歷的實體約有25.000個對象。 plainText屬性包含一個字符串值,每個約700字。

這個搜索大約需要20秒,這太慢了。

有沒有什麼辦法來優化性能?

我觀看了WWDC 2010 Session 137,她正在討論將關鍵字規範化爲單獨的實體以避免使用CONTAINS。這是改進它的一種方法,每個我只有700個關鍵字。製作700 x 25.000 = 17.500.000個關鍵字。我懷疑它會改善。我應該嘗試嗎?

回答

3

在25,000個實體中爲一個字符串搜索700個字的屬性確實會很慢,是的。你的wddc想法是正確的 - 你想要創建一個單獨的實體,它是一個單一的「關鍵字」,並有一對多的關係返回到你的實體。這樣,您將很快找到一個關鍵字實體,然後很快找到25,000個實體。這樣你就可以避免搜索每個很長的字符串。

tldr;是的,你應該嘗試

+0

儘管這個想法確實非常實用,但我會小心數據庫的大小是否重要,因爲這種方法將會極大地增加它的大小。 – Craimasjien

+0

直到嘗試纔會知道。它可以減小尺寸,因爲每個關鍵字都會存在一次。您將爲每個實體存儲約700 * 2 * sizeof(主鍵) - 關係表將包含實體的pk和關鍵字的pk。但是你會擺脫700 *(單詞的平均長度)。我敢打賭,它只是一個洗臉。 – Colin

+0

嗨科林,謝謝你的回答。我確實創建了與Part實體(最初包含文本)具有多對多關係的Keyword實體。現在我需要最快的查詢來獲取包含所有查詢關鍵字的部分。我用關鍵字實體上的NSFetchRequest用謂詞(word == \「testword \」AND word = \「testword2 \」)嘗試了這種方式,我很快得到了關鍵字。只有當我循環訪問關鍵字並獲得部分內容時,才需要很長時間。你知道更快的方法來做到這一點嗎? –