Какая функция близости обеспечивает наибольшую скорость и использует пространственный индекс в postGIS? - PullRequest
2 голосов
/ 08 декабря 2011

Я новичок в PostgreSQL / PostGIS. Я оцениваю это, чтобы решить простой алгоритм: Попробуйте найти все точки в радиусе (метрах) . Вот мой стол:

=> \d+ theuser;
                         Table "public.theuser"
  Column  |          Type          | Modifiers | Storage  | Description 
----------+------------------------+-----------+----------+-------------
 id       | bigint                 | not null  | plain    | 
 point    | geometry               |           | main     | 
Indexes:
    "theuser_pkey" PRIMARY KEY, btree (id)
    "point_index" gist (point)
Referenced by:
    ...
Has OIDs: no

Я добавляю индекс гистограммы в столбец point, я не знаю, правильный ли это дизайн. Все «точки» вставлены с SRID=4326.

Кажется, есть 2 способа получить очки поблизости:

ST_Distance , ST_Distance_Sphere . Возьмите 2 , например:

select * from theuser where
ST_distance_sphere(point , ST_GeomFromText('POINT(120.9982 24.788)',4326)) < 100;

Интересно, какой алгоритм использует "point_index"? Если есть миллионы очков, оба могут выполнить очень быстро?

Еще один вопрос, как я могу запросить SRID ячейки (я искал, не найдя ответа)? Все, что я могу сделать, это с помощью hibernate-space-postgis, получить «com.vividsolutions.jts.geom.Point» и получить SRID из возвращенной точки. Как мне сделать запрос в SQL? Спасибо.

Окружающая среда:

=> select version();
                                                  version                                                  
-----------------------------------------------------------------------------------------------------------
 PostgreSQL 8.4.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit

=> SELECT postgis_lib_version();
 postgis_lib_version 
---------------------
 1.4.0

---- обновлено ----

Спасибо @filiprem, я попробовал это:

=> explain select * from theuser where
ST_distance_sphere(point , ST_GeomFromText('POINT(120.9982 24.788)',4326)) < 100;
                                                          QUERY PLAN                                                           
-------------------------------------------------------------------------------------------------------------------------------
 Seq Scan on theuser  (cost=0.00..1.15 rows=3 width=2644)
   Filter: (st_distance_sphere(point, '0101000020E610000080B74082E23F5E407D3F355EBAC93840'::geometry) < 100::double precision)
(2 rows)

Как узнать, использует ли он "point_index" gist (point)? Выживет ли он при поиске большого объема данных?

1 Ответ

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

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

До версии 1.3 ST_Expand обычноиспользуется в сочетании с && и ST_Distance для достижения того же эффекта, а в пре-1.3.4 эта функция была в основном сокращенной для этой конструкции.Начиная с версии 1.3.4, ST_DWithin использует более дистанционную функцию короткого замыкания, которая должна сделать ее более эффективной, чем в предыдущих версиях, для больших буферных областей.

Также используются сравнения и индексы ограничивающего прямоугольника:

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

...