У меня есть приложение, в котором пользователи хранят свои маршруты в нашей базе данных.
Маршруты хранятся в виде полилиний (linestrings). В базе также хранятся происшествия, дорожно-транспортные происшествия и тому подобное. Периодически нам нужно запрашивать маршрут, чтобы увидеть, есть ли какие-либо инциденты в радиусе 1k от маршрута.
Соединение по запросу структурировано следующим образом:
Route r left outer join Incident i on
r.PolyLine.STDistance(i.Location) < 1000
Теперь я также попробовал что-то вроде этого:
Route r left outer join Incident i on
r.PolyLine.STBuffer(1000).STIntersects(i.Location) = 1
На данный момент мы пытались улучшить скорость следующим образом:
- Уменьшить количество точек вдоль линии
- Добавьте пространственный индекс (хотя я не знаю, как его настроить)
1) выше сработало, но недостаточно хорошо, и наводит меня на мысль, что инцидент сравнивался с каждой точкой на маршруте, что кажется действительно неэффективным.
Мы рассматриваем длинные широчайшие как геометрию против географии, поэтому мы получаем доступ к ограничивающей рамке, а также к STContains.
Также рассматривайте возможность вызова сокращения на PolyLine перед проверкой инцидентов.