Разделение CoreData для более быстрого времени запроса - PullRequest
1 голос
/ 27 октября 2011

У меня есть огромная база данных базовых данных о долготах и ​​широтах для путей на карте.

У меня есть объект, называемый способом, который состоит из упорядоченного набора узлов (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 Ответ

5 голосов
/ 27 октября 2011
  1. Вы можете ускорить запрос, сохранив минимальные / максимальные значения в вашей сущности Way в виде масштабированных целых чисел вместо чисел с плавающей точкой. Выберите масштабный коэффициент, который дает приемлемое разрешение области, используйте его для предварительного масштабирования значений при их сохранении и используйте тот же масштабный коэффициент при выполнении запроса.

  2. Вы также можете посмотреть, как добавить структуру данных quadtree в вашу базовую модель данных, чтобы найти пути в нужной области.

  3. SQlite сработает при первом тесте, который не пройден в составном предикате, поэтому сначала поставьте самый дешевый тест.

  4. Также обратите внимание на включение индексации для этих 4 атрибутов.

Честно говоря, я удивлен, что это медленно. Сколько всего путей у вас в базе данных и сколько обычно в области, которую вы хотите запросить?

Вы пытались включить отладку SQL, чтобы увидеть, какой запрос фактически выполняется к базе данных? (подсказка: добавьте -com.apple.CoreData.SQLDebug 1 в качестве аргумента командной строки в редакторе схем для поведения «Выполнить»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...