Swift CoreData:访问关系比仅通过谓词获取要慢 - 是这样设计的吗?
Swift CoreData: accessing relationship is slower than just fetching by predicate - is it designed that way?
在我的应用程序中,我有 100 个图书馆,每个图书馆包含 5000 本书。
如果我想打印 10 个库及其 10 个最近添加的库,我可以通过访问关系来获取它们,然后 .suffix
返回的 NSSet
和 运行 sort
或者我可以通过留下一个 libraryID
属性 来找到这些库,我以后可以在 NSPredicate
中使用它,如下所示:
let fetchRequest = ... "Library"
let sort = NSSortDescriptor(key: "some key for ordering", ascending: false)
fetchRequest.sortDescriptors = [sort]
fetchRequest.fetchLimit = 10
let libraries = try context.fetch(fetchRequest) as? [Library]
for library in libraries {
let fetchRequest = "Book"
fetchRequest.fetchLimit = 10
let predicate = NSPredicate(format: "libraryID == %@", library.id ?? "")
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "added date", ascending: false)]
...
}
我不明白的是为什么第二个选项使用 15% 的 CPU,而直接访问关系要慢大约 10 倍。
我对数据库的理解是,我们有适当的关系来防止做这些事情,有点硬编码父 属性 的 ID 到子 属性 因为现在我在质疑什么关系甚至有好处。
有一件事我可以看到一种有用的关系,即如果我们能够在 Library
对象或其 books
关系上执行 .fetch
权利 -那可能吗?因为这样我们就不必每次都扫描整个 table,而是只在关系的条目内搜索。
通过关系访问,然后排序和丢弃 4950 / 5000 个项目意味着所有这些处理都必须在内存中完成。使用获取请求意味着您可以让数据库来完成工作。
如果你在图书馆和它的书之间有关系,你可以在谓词中使用它。在你上面的代码中,这将是这样的:
let predicate = NSPredicate(format: "library == %@", library)
这可能比存储 ID 更快,除非您在图书馆 ID 上添加了索引。
在我的应用程序中,我有 100 个图书馆,每个图书馆包含 5000 本书。
如果我想打印 10 个库及其 10 个最近添加的库,我可以通过访问关系来获取它们,然后 .suffix
返回的 NSSet
和 运行 sort
或者我可以通过留下一个 libraryID
属性 来找到这些库,我以后可以在 NSPredicate
中使用它,如下所示:
let fetchRequest = ... "Library"
let sort = NSSortDescriptor(key: "some key for ordering", ascending: false)
fetchRequest.sortDescriptors = [sort]
fetchRequest.fetchLimit = 10
let libraries = try context.fetch(fetchRequest) as? [Library]
for library in libraries {
let fetchRequest = "Book"
fetchRequest.fetchLimit = 10
let predicate = NSPredicate(format: "libraryID == %@", library.id ?? "")
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "added date", ascending: false)]
...
}
我不明白的是为什么第二个选项使用 15% 的 CPU,而直接访问关系要慢大约 10 倍。
我对数据库的理解是,我们有适当的关系来防止做这些事情,有点硬编码父 属性 的 ID 到子 属性 因为现在我在质疑什么关系甚至有好处。
有一件事我可以看到一种有用的关系,即如果我们能够在 Library
对象或其 books
关系上执行 .fetch
权利 -那可能吗?因为这样我们就不必每次都扫描整个 table,而是只在关系的条目内搜索。
通过关系访问,然后排序和丢弃 4950 / 5000 个项目意味着所有这些处理都必须在内存中完成。使用获取请求意味着您可以让数据库来完成工作。
如果你在图书馆和它的书之间有关系,你可以在谓词中使用它。在你上面的代码中,这将是这样的:
let predicate = NSPredicate(format: "library == %@", library)
这可能比存储 ID 更快,除非您在图书馆 ID 上添加了索引。