Эффективный отсортированный ограничивающий запрос - PullRequest
0 голосов
/ 31 марта 2011

Как бы я создал индексы в PostgresSQL 8.3, которые бы делали эффективный запрос отсортированного ограничивающего прямоугольника?Таблица, которую я запрашиваю, содержит довольно много строк.

То есть я хочу создать индексы, которые делают следующий запрос максимально эффективным:

SELECT * FROM features 
WHERE lat BETWEEN ? AND ?
AND lng BETWEEN ? AND ?
ORDER BY score DESC

Таблица функций выглядит следующим образом:

   Column   |          Type          |   
------------+------------------------+
 id         | integer                |
 name       | character varying(255) | 
 type       | character varying(255) | 
 lat        | double precision       | 
 lng        | double precision       | 
 score      | double precision       | 
 html       | text                   | 

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Чтобы создать индекс GiST для точечного атрибута, чтобы мы могли эффективно использовать блочные операторы в результате функции преобразования:

CREATE INDEX pointloc
    ON points USING gist (box(location,location));
SELECT * FROM points
    WHERE box(location,location) && '(0,0),(1,1)'::box;

http://www.postgresql.org/docs/9.0/static/sql-createindex.html

Это пример из 9.0 документов.Это должно работать для 8.3, хотя, поскольку это функции, которые существуют уже целую вечность.

0 голосов
/ 31 марта 2011

Похоже, вы захотите взглянуть на PostGIS , модуль PostgreSQL для пространственных типов данных и запросов. Он поддерживает быстрый поиск с использованием индексов GiST. К сожалению, я не могу вести вас дальше, так как сам не использовал PostGIS.

0 голосов
/ 31 марта 2011

Вы можете попробовать использовать индекс GiST для реализации R-дерева. Этот тип индекса плохо документирован, поэтому вам, возможно, придется просмотреть пример кода в исходном дистрибутиве.

(Примечание. Мой предыдущий совет по использованию индексов R-Tree устарел; они устарели.)

...