1

postgisでは、ST_GeomFromText呼び出しは非常に高価ですか?いくつかの基準に一致し、他のポイントから一定の距離内にある別のポイントに最も近いポイントを見つけようとするクエリが頻繁に呼び出されるため、私は主に質問します。同じST_GeomFromText2回:

 $findNearIDMatchStmt = $postconn->prepare(
    "SELECT     internalid " .
    "FROM       waypoint " .
    "WHERE      id = ? AND " .
    "           category = ? AND ".
    "           (b.category in (1, 3) OR type like ?) AND ".
    "           ST_DWithin(point, ST_GeomFromText(?," . SRID .
    "           ),".  SMALL_EPSILON . ") " .
    "           ORDER BY ST_Distance(point, ST_GeomFromText(?,", SRID .
    "           )) " .
    "           LIMIT 1");

これを書き直すより良い方法はありますか?

少しOT:プレビュー画面では、すべてのアンダースコアが次& # 9 5 ;のようにレンダリングされています-投稿にそのように表示されないことを願っています。

4

2 に答える 2

1

ST_GeomFromText()特にコストがかかるとは思いませんが、過去にPostGIS関数を作成し、変数を宣言し、その結果を変数に代入することでクエリを最適化しましたST_GeomFromText

さまざまなパラメーターを使用してクエリの実行計画を確認してみましたか? これにより、クエリのどの部分に時間がかかっているかを明確に把握できるはずです。

ST_DWithin()実行時間のほとんどはandの呼び出しにあると思いST_Distance()ますが、id 列と category 列がインデックス化されていない場合は、興味深いテーブル スキャンが行われている可能性があります。

于 2008-08-30T22:16:10.093 に答える
1

@UbiguchST_DWithin空間インデックスを使用しているように見えるため、クエリされるポイントの数がかなり迅速に削減されるようです。

 navaid=> explain select internalid from waypoint where id != 'KROC' AND ST_DWithin(point,                                                                  ST_GeomFromText('POINT(-77.6723888888889 43.1188611111111)',4326), 0.05) order by st_distance(point, st_geomfromtext('POINT(-77.6723888888889 43.1188611111111)',4326)) limit 1;
                                                                                                                                                                                                                                                      QUERY PLAN                                                                                                                                                                                                                                                       
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=8.37..8.38 rows=1 width=104)
   ->  Sort  (cost=8.37..8.38 rows=1 width=104)
         Sort Key: (st_distance(point, '0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry))
         ->  Index Scan using waypoint_point_idx on waypoint  (cost=0.00..8.36 rows=1 width=104)
               Index Cond: (point && '0103000020E61000000100000005000000000000C03B6E53C000000060D0884540000000C03B6E53C0000000409D95454000000020D56753C0000000409D95454000000020D56753C000000060D0884540000000C03B6E53C000000060D0884540'::geometry)
               Filter: (((id)::text <> 'KROC'::text) AND (point && '0103000020E61000000100000005000000000000C03B6E53C000000060D0884540000000C03B6E53C0000000409D95454000000020D56753C0000000409D95454000000020D56753C000000060D0884540000000C03B6E53C000000060D0884540'::geometry) AND ('0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry && st_expand(point, 0.05::double precision)) AND (st_distance(point, '0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry) < 0.05::double precision))
(6 rows)

とがないorder bylimit、典型的なクエリは最大 5 ~ 10 個のウェイポイントしか返さないように見えます。したがって、返されるポイントに適用されるフィルターの追加コストについて心配する必要はおそらくありません。

于 2008-08-31T01:37:11.203 に答える