Сам по себе SQL выглядит нормально, большая часть процессорного времени должна быть потрачена на математику ... Есть два пути оптимизации
- упрощение формул
- Ранняя фильтрация строк ("обрезка") на основе еще более простого вычисления
У меня нет времени на полную информацию, но вот общая идея:
Это приблизительное расстояние от эталонного местоположения ZipCode и других местоположений, с дешевым (с точки зрения процессора) вычислением, и только выполнение полной математики (с лучшей формулой, чем в оригинале) запрос), для местоположений, которые находятся ниже 50 миль (+ небольшая дополнительная, чтобы учесть возможную недооценку).
Оценка расстояния и обрезки
Вычислим, раз , расстояние expessed в милях, соответствующее одному градусу широты и один градус долготы, от места ссылки ZipCode; Назовите эти MpDLat и MpDLong. Возможно, мы вычислим дробное значение степени, что соответствует нашему целевому радиусу от опорного местоположения; Назовите эти Dp50Lat и Dp50Long. Тогда работа с [абсолютной величине] разности широт и долгот между, по отношению к опорному местоположению и отфильтровать местоположения, для которого это расстояние в одном направлении (лат или длинный) превышает наш предел. то есть что-то вроде следующего
WHERE .... (some other condidtions....)
AND (abs(z.latitude - 32.91336) * MpDLat) < 50
AND (abs(z.longitude + 85.93836) * MpDLong) < 50
--or, if we got by the Dp50 values
WHERE .... (some other condidtions....)
AND (abs(z.latitude - 32.91336) < Dp50Lat
AND (abs(z.longitude + 85.93836) < Dp50Long
Расчет расстояния (для тех мест, которые не легко фильтруются)
В зависимости от требуемого уровня точности, может быть приемлемо придерживаться коэффициентов MpD (я предполагаю, что погрешности составляют менее мили или около того, для расстояний порядка 50 миль в пределах континентальной части США). Тогда расстояния будут рассчитываться как:
Sqrt ((z.latitude - 32.91336) ^ 2 + (z.longitude + 85.93836) ^ 2
или, если мы заинтересованы только в том, чтобы отфильтровать их без необходимого расстояния как такового, мы можем работать с квадратами, т.е.
... ГДЕ (z.latitude - 32,91336) ^ 2 + (z.lonitude + 85,93836) ^ 2 <2500 - 2509 - это 50 ^ 2 </p>
Я предполагаю, что этот тип аппроксимации является приемлемым, поскольку допускаются гораздо большие ошибки, принимая во внимание тот факт, что расстояние по дорогам (что, вероятно, в конечном итоге и является желаемым) редко совпадает с расстоянием "как в мухи ';-) Я могу рассчитать потерю точности в худшем случае (но опять же, сейчас нет времени ...)
Если требуется точное расстояние, мы используем немного лучшую формулу, чем оригинал, эта, кажется, напрямую получена из сферического закона косинуса. Мы, вероятно, можем сделать лучше.
Вариации на выше
Рассмотренные выше идеи могут быть реализованы различными способами, например, с использованием временных таблиц SQL или различных конструкций для запроса (запросов) и т. Д.