拆分CoreData以加快查询时间

时间:2011-10-26 20:58:36

标签: iphone sql ios sqlite core-data

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

我有一个叫做方式的对象,它包含一组有序的节点(lon,lat)。我还将封闭盒存放在路上(minLon,minLat,maxLon,maxLat ......)。

Data Model

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

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

它的大坝很慢!

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

我该怎么做?

1 个答案:

答案 0 :(得分:5)

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

  2. 您还可以查看将核心数据模型中的quadtree数据结构添加到所需区域中的方式。

  3. SQlite会在复合谓词失败的第一次测试中挽救,所以先把最便宜的测试放在首位。

  4. 另请参阅为这4个属性启用索引。

  5. 说实话,我很惊讶这很慢。您在数据库中拥有多少总方式,以及您想要查询的区域中通常有多少种方式?

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