我有450.000张记录的coredata。
为了在uitableview中显示它,我使用了NSFetchedResultsController。很管用,但有大问题。
在NSFetchedResultsController开始工作之前,我们需要调用performFetch: i--我的情况是--这个函数工作大约2-3分钟。之后,我可以在UITable中显示数据,没有任何问题。但那2-3分钟我都要死了
不会那么糟糕,但我也需要在这张桌子上搜索。因此,对于搜索,我需要更改谓词,调用performFetch:,然后再等待2-3分钟!
还有让performFetch:更快的吗?或者至少有人可以告诉我如何在不调用performFetch:的情况下进行搜索
发布于 2013-04-07 10:07:04
2到3分钟是一个很长的时间去看45万记录。我怀疑大部分时间都是在sqlite调用中花费的,而不是您自己的代码。使用Time,查看performFetch:
树下花费最多时间的调用。
要查看您的SQL是否经过优化,请将其添加到Scheme设置中的“启动时传递的参数”,从而启用SQLite日志记录:
-com.apple.CoreData.SQLDebug 1
有关此问题的更多细节,请参见此问题。
运行您的应用程序,并记下调用performFetch:时执行的查询。接下来,阅读有关EXPLAIN QUERY PLAN
的内容。如果sqlite是瓶颈的话,这是您可以使用的唯一最有用的工具。您需要从应用程序(模拟器或设备)获取.sqlite文件,并在查询上运行EXPLAIN查询计划,查看是否花费太长时间。如果我不得不猜测,我会说您的查询正在执行一个完整的表扫描,而不是使用适当的索引。一张全表扫描是昂贵的。
如果这确实是瓶颈,它也可以帮助您优化您的搜索。
这里有一些有用的链接。
发布于 2013-03-29 13:42:09
2到3分钟绝对是太长了,一次只有450.000次记录。您是用谓词解析字符串吗?确保您使用了以下优化策略:
fetchBatchSize
优化您的获取。(尝试一些设置,看看什么对您的数据类型最有效)。至于搜索,这里有一个对我有用的策略:
https://stackoverflow.com/questions/15703879
复制相似问题