【问题标题】:Bad performance Core Data CONTAINS predicate性能不佳的核心数据包含谓词
【发布时间】:2011-10-05 09:07:40
【问题描述】:

我正在使用 NSFetchedResultsController 在 UITableView 中显示一些搜索结果。搜索结果由以下谓词请求:

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

搜索所经过的实体有大约 25.000 个对象。 plainText 属性包含一个字符串值,每个值大约 700 个单词。

这个搜索需要大约 20 秒,太慢了。

有没有办法优化性能?

我观看了 WWDC 2010 Session 137,她正在谈论将关键字规范化为一个单独的实体以避免使用 CONTAINS。这是一种改进的方法,只有我每个有700个关键字。使其成为 700 x 25.000 = 17.500.000 个关键字。我怀疑它会改善。我应该试试吗?

【问题讨论】:

    标签: iphone objective-c ios ipad core-data


    【解决方案1】:

    在 25,000 个实体中搜索 700 个单词的属性确实会很慢,是的。您的 wwdc 想法是正确的 - 您想要创建一个单独的实体,它是一个单一的“关键字”,与您的实体有一对多的关系。这样,您将很快找到一个关键字实体,然后很快从您的 25,000 个实体中找到这些实体。这样你就可以避免搜索每一个很长的字符串。

    tldr;是的,你应该试试

    【讨论】:

    • 虽然这个想法确实很实用,但我还是要小心数据库的大小是否重要,因为这种方法会极大地增加它的大小。
    • 在您尝试之前不会知道。它可以降低大小,因为每个关键字都会存在一次。您将为每个实体存储大约 ~700 * 2 * sizeof(primary key) - 关系表将包含实体的 pk 和关键字的 pk。但是你会摆脱 700 * (单词的平均长度)。我敢打赌这只是洗个澡。
    • 您好科林,感谢您的回答。我确实创建了与 Part 实体(最初包含文本)具有多对多关系的 Keyword 实体。现在我需要最快的查询来获取包含所有查询关键字的部分。我在带有谓词(word == \"testword\" AND word = \"testword2\")的关键字实体上使用 NSFetchRequest 进行了尝试,这样我确实可以快速获取关键字。只有当我然后循环遍历关键字并到达那里时,才需要很长时间。你知道更快的方法吗?
    • 与?那没有意义。你是说OR?在任何情况下,都不要这样做 - 为您的部件实体执行获取请求,查看如何在谓词中使用 ANY。
    • 您需要从部件到关键字的多对多关系(如果您想这样做,反之亦然)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多