Как преобразовать mysql-запрос Google Maps в oracle, и есть ли снижение производительности? - PullRequest
3 голосов
/ 19 декабря 2011

Я пытаюсь найти предприятия в радиусе 25 миль от точки и увидел «правильный» запрос MySQL от Google здесь (http://code.google.com/apis/maps/articles/phpsqlsearch.html#findnearsql):

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * 
cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) 
AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

Однако моя база данных находится в Oracle, и я хотел преобразовать этот запрос в oracle, так что вот что я создал, что, похоже, тоже работает.

SELECT id, ( 3959 * acos( cos( degree2radian(41.912434) ) * cos( degree2radian( latitude ) ) * cos( degree2radian( longitude ) - degree2radian(-87.6357596) ) + sin( degree2radian(41.912434) ) * sin( degree2radian( latitude ) ) ) ) AS distance 
FROM markers 
GROUP BY id, latitude, longitude 
HAVING ( 3959 * acos( cos( degree2radian(41.912434) ) * cos( degree2radian( latitude ) ) * cos( degree2radian( longitude ) - degree2radian(-87.6357596) ) + sin( degree2radian(41.912434) ) * sin( degree2radian( latitude ) ) ) )  < 25 ;

, где я также определил функцию:

create or replace
FUNCTION degree2radian(pin_Degree IN NUMBER)
    RETURN NUMBER DETERMINISTIC IS
BEGIN
    RETURN pin_Degree / 57.2957795; --1R = 180C
END degree2radian;

Кажется, что все работает, но я не уверен, правильно ли я преобразовал запрос, и если да, есть ли проблемы с производительностью или какие-либо способы, которыми я могу очистить этот запрос (т. Е. Принцип СУХОЙ и т. Д.) ??

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Похоже, что у Oracle нет нативной функции, поэтому я подозреваю, что у вас все будет в порядке.

Дешевое решение: нарушить нормализацию и значение в градусах в столбце радиан, используя триггер.

Дорогое решение: купите Oracle Spatial, который может быстрее ответить на пространственные вопросы такого рода благодаря использованию индексации по r-дереву.

1 голос
/ 19 декабря 2011

Я не знаю структуру вашей таблицы, но сгруппированное предложение с идентификатором в нем выглядит странно. Это на самом деле делает что-нибудь? Или вы можете оставить группу и заменить ее на «где».

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

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

...