更改核心数据关系验证规则后保存缓慢

Posted

技术标签:

【中文标题】更改核心数据关系验证规则后保存缓慢【英文标题】:Slow save after changing Core Data relationship validation rule 【发布时间】:2016-07-14 10:46:34 【问题描述】:

这是一个奇怪的问题。在我的数据模型上,我创建了一个新版本,只是将关系修改为可选(而不是非可选)

使用使用先前模型版本创建的大型数据库运行我更新的应用程序会导致第一次保存运行非常缓慢。每次应用启动后都会发生这种情况!

如果我使用更新的应用程序(即使用新模型版本)从头开始构建大型数据库,则不会出现问题。

有什么想法吗?

更新 1: 我没有提到一个重要的事实,即修改后的关系(从non-optional修改为optional)与一个包含大量二进制数据(blob)的图像实体相关联。

所以,在添加-com.apple.CoreData.SQLDebug 1 之后,我想到了以下内容:

在添加模型版本之后,有一个轻量级迁移,它会重建映像表并重新生成所有索引。 第一次保存时会发生以下情况:
    BEGIN EXCLUSIVE 很少UPDATE COMMIT(非常快!) pragma page_count pragma 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。 【参考方案1】:

首先将图像保存在核心数据中并不是一个好习惯。相反,您可以尝试将图像保存在文档目录中,并将它们的路径放在数据库中。较大尺寸的图像会大大减慢保存操作。

保存核心数据需要时间的另一个原因是,如果我们在 for 循环中为您尝试保存的每个实体调用 managedObjectContext.save()。而是插入所有实体并调用 save() 一次。

【讨论】:

感谢您的评论。该问题仅在更改数据模型中的关系(从非可选到可选)后才开始。我没有在任何循环中运行保存,我保存的任何内容,不仅仅是图像,在第一次保存时都需要 3-10 秒。在下一次应用启动之前,后续保存都可以。 sqlite 文件显然出了点问题,但我不知道是什么以及为什么,我不知道如何调试这个......

以上是关于更改核心数据关系验证规则后保存缓慢的主要内容,如果未能解决你的问题,请参考以下文章

XAF实现运行时填加验证规则并保存到数据库中

如何将一组验证规则应用于保存到特定表的所有表单?

基于数据透视表 laravel 的唯一名称规则验证

WPF 数据绑定和验证规则最佳实践

MyCat 学习笔记 第十篇.数据分片 之 ER分片

Laravel 有时验证规则