【发布时间】:2016-07-14 10:46:34
【问题描述】:
这是一个奇怪的问题。在我的数据模型上,我创建了一个新版本,只是将关系修改为可选(而不是非可选)
使用使用先前模型版本创建的大型数据库运行我更新的应用程序会导致第一次保存运行非常缓慢。每次应用启动后都会发生这种情况!
如果我使用更新的应用程序(即使用新模型版本)从头开始构建大型数据库,则不会出现问题。
有什么想法吗?
更新 1:
我没有提到一个重要的事实,即修改后的关系(从non-optional修改为optional)与一个包含大量二进制数据(blob)的图像实体相关联。
所以,在添加-com.apple.CoreData.SQLDebug 1 之后,我想到了以下内容:
- 在添加模型版本之后,有一个轻量级迁移,它会重建映像表并重新生成所有索引。
- 第一次保存时会发生以下情况:
BEGIN EXCLUSIVE- 很少
UPDATE -
COMMIT(非常快!) pragma page_countpragma freelist_count-
pragma incremental_vacuum(4055)(非常慢,差不多 4 秒!)
pragma incremental_vacuum 在 iPhone 6 设备上需要将近 4 秒,而在速度较慢的设备上则需要更多时间(超过 10 秒)。
请注意,在第一次保存时,无论您开发哪个应用,步骤 1-5 始终会在应用加载后进行。
我的情况的独特之处在于我还得到了incremental_vacuum。我可以看到它被调用的原因(我猜是因为在轻量级迁移阶段重建大图像表导致有太多未使用的页面),但是我不明白为什么稍后在后续应用加载时调用它。
第一次调用incremental_vacuum不应该修复未使用页面的问题并相应地更新sqlite文件吗?似乎incremental_vacuum的结果保存在内存中,没有保存到文件中(虽然确实保存了文件)
【问题讨论】:
-
尝试使用 Instruments 来查看保存速度变慢的确切位置。
-
汤姆,感谢您的评论。我现在改用 SQL 日志,请参阅更新 1。
标签: ios sqlite core-data database-migration