Вопрос по оптимизации запросов индекса столбцов PostgreSQL - PullRequest
1 голос
/ 29 августа 2011

Будет ли следующий запрос оптимизирован, если я создам индексы по широте * 69 и долготе * 46?

select * from locations where abs(latitude*69 - 3036) <= 25
                          and abs(longitude*46 - 8970) <= 25

Или я должен удалить abs() и кодировать его больше как:

select * from locations where (latitude*69 - 3036) between -25 and 25 
                          and (longitude*46 - 8970) between -25 and 25

или еще более упрощенно:

select * from locations where latitude*69 between 3036-25 and 3036+25 
                          and longitude*46 between 8970-25 and 8970+25

Ответы [ 2 ]

4 голосов
/ 30 августа 2011

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

Создайте GIST INDEX и используйте EXPLAIN или EXPLAIN VERBOSE перед запросом, чтобы увидеть план выполнения, который использует postgres. Если вы видите что-то вроде SCAN SEQ , тогда не с использованием индекса. Если вы видите INDEX SCAN , тогда равен , используя индекс для этого конкретного запроса.

Чтобы использовать индексы для данных ГИС, вы должны использовать функции, которые используют ограничивающую рамку geom / geog. В Postgis есть функции, которые используют ограничивающие рамки для использования индексов, как и все операторы , или некоторые функции, которые используют операторы внутри для фильтрации.

Я думаю, что лучший запрос, который вы могли бы задать, чтобы убедиться, что lonlat находится в коробке (это то, что вы пытаетесь сделать?), Это:

SELECT *
FROM locations
WHERE
    ST_Dwithin(
        'POINT('||(longitude*46)||' '||(latitude*69)||')'::geometry,
        'POINT(8970 3036)'::geometry
    ) 

(не проверено, но должно работать и с индексами)

1 голос
/ 30 августа 2011

Я понял из твоего вопроса, что ты ищешь точки в блоке из 25 единиц вокруг некоторой точки. Любой индекс postgres (GIN, GiST, b-tree, r-tree и т. Д.) Будет хорошо работать в этом запросе, если locations являются только точками. Если местоположения включают в себя некоторые другие геометрии (формы приема вышек сотовой связи, области маршрутов доставки и т. Д.), То вам нужно дерево GiST. Но лучший подход в целом, поскольку из некоторых других вопросов у меня складывается впечатление, что география имеет основополагающее значение для того, над чем вы работаете, это использование PostGIS или, по крайней мере, поддержка геометрии , встроенная Postgres . Дословный перевод вашего примера будет:

select * from locations 
where my_point_column <@ box '((194.4, 43.36),(194.5 43.6))'

в Postgres для столбца с геометрическим типом, и версия PostGIS практически одинакова с множеством улучшений и утилит для всех видов данных.

...