2011-12-08 13 views
2

私はPostgreSQL/PostGISを初めて使用しています。私は単純なアルゴリズムを解くためにそれを評価しています:半径(メートル)のすべての点を探してみてください。ここに私のテーブルです:それは正しい設計であれば、私はpoint列にGiSTインデックスを追加どの近接関数が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 

、私は知りません。 'points'がすべて挿入されています。SRID=4326です。

近くのポイントを得るためにそこにいる2つの方法を思わ:

ST_DistanceST_Distance_Sphereを。 例えば2を取る:

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

私は "point_index" の使用を作るどのアルゴリズムだろうか?何百万というポイントがあれば、両方とも非常に高速に実行できますか?

もう1つの質問ですが、セルのSRIDをクエリするにはどうすればよいですか? 私ができることは、hibernate-spatial-postgisで "com.vividsolutions.jts.geom.Point"を取得し、返されたポイントからSRIDを取得することです。 SQLでどのようにクエリを実行しますか?ありがとう。

環境:それはを使用する場合、私は知っているどのように

=> 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) 

=> 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は、私はこれを試してみました"point_index" gist (point)?データ量の多い検索でも存続しますか?

+0

私は、メインの質問に答えることはできませんが、[ 'ST_SRID'](http://postgis.refractions.net/documentation/manual-1.4/ST_SRID.html)SRIDを使用して取得するための –

+0

はあなたに感謝@ skyhisi – smallufo

+2

'EXPLAIN SELECT ... 'を実行して、どのアルゴリズムを使用しているか確認してください。 – filiprem

答えて

2

ST_DWithinが一番速いと聞きましたが、実際にはdocumentationにあります。ST_DWithinの新しいバージョンでは、チューニングされています。前1.3

、ST_Expandは一般に、同じ効果を達成するために& &と のST_Distanceと組み合わせて使用​​し、予め1.3.4にこの関数 は、その構築のために基本的に短手ました。 1.3.4より、ST_DWithin はより大きなバッファー領域の場合よりも以前のバージョンよりも効率的になるように、より短絡距離の関数を使用します( )。

また、それはボックスのcomparitionsとインデックスの境界を使用しています。

この関数呼び出しは、自動的に ジオメトリ上で使用可能なインデクスを使うバウンディングボックス 比較が含まれます。

関連する問題