2014-02-07 3 views
1

У меня SQL-запрос, который работает медленно, и я решил, что он связан с расчетами расстояний. Я использую эти вычисления для сортировки, чтобы пользователи, ищущие товары, могли быть представлены с ближайшими к ним результатами географически.Эффективность расчета расценок MSSQL География

Я использую функцию географии STDistance для расчета расстояния от предварительно рассчитанного местоположения типа географии данных sql.

Location1.STDistance (LOCATION2)

Location1 основан на местоположении пользователя, LOCATION2 является расположение элемента.

Как только мы попадаем в тысячи строк, это плохо работает, но я не знаю никаких умных способов сделать это. Я не думаю, что было бы целесообразно хранить все возможные расчеты расстояния для поиска и вычисления во время запроса. (Это означало бы сохранение количества уникальных местоположений пользователя. X уникальных позиций.)

Местоположение определяется почтовым индексом. Географически область ограничена Соединенными Штатами.

Любые другие мысли?

ответ

2

Способ, которым люди обычно имеют дело с медленными гео-запросами, заключается в том, чтобы уменьшить набор до достаточно малого, чтобы его можно было выполнить в разумные сроки. В вашем случае люди обычно используют метод, известный как «гео-бокс».

Концепция состоит в том, чтобы найти близлежащие точки, которые попадают под определенную границу лат/лон. Например. Если я хочу найти всех людей около 42.45678, -22.6543, я бы начал с определения того, что является типичным минимальным расстоянием. Предположим, что это было 25 миль или + - 0,15 градуса лата и долго. Я бы запросил все это. (Лат между 41.95 и 42.95, Lon между -22.15 и -23.15). Затем я применил бы функцию расстояния, чтобы найти ближайшего человека в моем сокращенном наборе. Расчет расстояний намного быстрее после того, как я устранил точки, которые, очевидно, не очень близки.

Если мой сниженный набор кажется слишком большим, то я могу использовать меньшую коробку. Если мой результирующий набор не возвращает строк или слишком мало строк, тогда я могу использовать рекурсивный альгортм, который выбирает все большую коробку, пока не нахожу достаточно большой набор результатов.

Единственный подход к этому подходу заключается в том, что он имеет возможность опустить ближайшую точку. Подумайте о круге, который касается краев ящика против коробки внутри круга. Точки в углу окна могут быть включены, но более близкие точки вне поля (по оси x или оси y) могут быть исключены. Кроме того, коробки Lat/Lon на самом деле больше похожи на трапеции, чем на квадраты, когда вы уходите от экватора.

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

+0

Ну, мне это нравится, но у меня уже есть коробка, потому что у меня есть лат, длина всех почтовых индексов и даже думаю, что это не очень точно, это сужает уже сделанные вычисления. – Nate

Смежные вопросы