【问题标题】:Splitting CoreData up for a faster query time拆分 CoreData 以获得更快的查询时间
【发布时间】:2011-10-26 20:58:35
【问题描述】:

我有一个巨大的核心数据数据库,其中包含地图上路径的经度和纬度。

我有一个名为 way 的对象,它由一组有序的节点 (lon,lat) 组成。我还在途中存储了封闭框(minLon,minLat,maxLon,maxLat ...)。

我的查询找到了地图特定区域中的所有方式:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"minLon < %f AND maxLon > %f AND minLat < %f AND maxLat > %f",
        maxLon, minLon, maxLat, minLat];

它的大坝很慢!

我加快查询速度的想法是以某种方式将数据按方形区域拆分(多个表?多个.sqllite 文件?创建位置的哈希?)因此要搜索的数据更少。

我该怎么做?

【问题讨论】:

    标签: iphone sql ios sqlite core-data


    【解决方案1】:
    1. 您可以通过将 Way 实体中的最小值/最大值存储为缩放整数而不是浮点数来加快查询速度。选择一个可以为您提供可接受的区域分辨率的缩放因子,在存储值时使用它来预缩放值,并在执行查询时使用相同的缩放因子。

    2. 您还可以考虑将 quadtree 数据结构添加到您的核心数据模型中,以便在所需区域的 Ways 上进行定位。

    3. SQlite 将在第一个在复合谓词中失败的测试中退出,因此首先放置最便宜的测试。

    4. 还要考虑为这 4 个属性启用索引。

    说实话,我很惊讶这很慢。您的数据库中总共有多少条 Ways 以及您想要查询的区域中通常有多少条?

    您是否尝试过打开 SQL 调试以查看实际对数据库运行的查询? (提示:添加 -com.apple.CoreData.SQLDebug 1 作为运行行为的方案编辑器中的命令行参数)

    【讨论】:

    • 好主意。我会毫不犹豫地把它付诸实践。我的.sqlite 文件是 40MB。有 700K 节点和 60K 路。如果您有兴趣,它的开放街道地图数据。
    • 很好的建议。我以前没有听说过索引核心数据,我该怎么做/我应该谷歌什么? :)
    • 在 Core Data 模型编辑器中选择一个属性并检查右侧 Core Data Inspector 面板中的“Indexed”选项。这可能有帮助,也可能没有帮助 - 您需要使用 SQLDebug 命令行标志进行分析,该标志将准确显示每个查询需要多长时间。索引会减慢插入速度并增加数据库大小,但会加快查询速度(理论上)。
    • 老实说,我认为四叉树解决方案将是最有效和可扩展的——但不幸的是,它也是最难实施的。
    猜你喜欢
    • 2017-02-09
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多