Оптимизация поиска ближайших соседей - PullRequest
2 голосов
/ 11 апреля 2019

Существует две (упрощенные) таблицы:

Свойства:

id | geog
___|_______
 1 | <geog>
 2 | <geog>
 3 | <geog>

POI (точки интереса):

id | name         | category  | geog
___|______________|___________|_______
 1 | X Hospital   | health    | <geog>
 2 | Y Hospital   | health    | <geog>
 3 | Y University | education | <geog>
 4 | Z University | education | <geog>
 5 | Z Restaurant | food      | <geog>
 6 | X Restaurant | food      | <geog>

Желаемый результат:

location_id | distance_to_closest_health | distance_to_closest_education | distance_to_closest_food
____________|____________________________|_______________________________|_________________________
          1 |                        300 |                           500 |                    100
          2 |                        450 |                           550 |                    200
          3 |                        150 |                           600 |                    150

Следующий запрос работает нормально, но очень медленно (и становится медленнее в арифметической прогрессии с увеличением LIMIT):

SELECT 
    properties.id AS "location_id",
    (SELECT ST_Distance(pois.geog, properties.geog) FROM pois WHERE pois.category = 'health' ORDER BY ST_Distance(pois.geog, properties.geog) LIMIT 1) AS "distance_to_closest_health",
    (SELECT ST_Distance(pois.geog, properties.geog) FROM pois WHERE pois.category = 'education' ORDER BY ST_Distance(pois.geog, properties.geog) LIMIT 1) AS "distance_to_closest_education",
    (SELECT ST_Distance(pois.geog, properties.geog) FROM pois WHERE pois.category = 'food' ORDER BY ST_Distance(pois.geog, properties.geog) LIMIT 1) AS "distance_to_closest_food"
FROM properties 
LIMIT 10;

Каков будет лучший (и более быстрый) подход для достиженияжелаемый результат?

...