実行環境

"ST_Distance(a,b) = 0" 超遅い

"a && b" 超早い

"a && b" で絞り込んでから "ST_Distance(a,b) = 0" をやる

まとめ

ST_Distance(a,b) = 0a && b(a && b) and ST_Distance(a,b) = 0
Brazil48905.483 ms1.314 ms (x37218 Faster)22130.168 ms (x2.2 Faster)
France23675.701 ms1.975 ms (x11987 Faster)5292.297 ms (x4.5 Faster)
Japan49429.548 ms1.511 ms (x32713 Faster)28958.234 ms (x1.7 Faster)

検索の実行順を厳密に指定したら、もうちょっと速くならない ? → ならなかった

demo=# SELECT b.sovereignt
demo-# FROM
demo-#   (
demo(#     SELECT t.geom AS geom
demo(#     FROM countries_table t
demo(#     WHERE t.sovereignt = 'Brazil'
demo(#   ) a,
demo-#   (
demo(#     SELECT q.sovereignt AS sovereignt, q.geom AS geom
demo(#     FROM countries_table p, countries_table q
demo(#     WHERE p.sovereignt = 'Brazil' AND (p.geom && q.geom)
demo(#   ) b
demo-# WHERE ST_Distance(a.geom, b.geom) = 0;
 sovereignt
------------
 Argentina
 Bolivia
 Brazil
 Colombia
 France
 Guyana
 Peru
 Paraguay
 Suriname
 Uruguay
 Venezuela
(11 rows)

Time: 22210.620 ms

関数化する

絞り込んでから距離の比較を関数化する

CREATE FUNCTION ST_MyOverlap(a GEOMETRY, b GEOMETRY) RETURNS BOOLEAN AS $$
  BEGIN
    RETURN (a && b) AND ST_Distance(a, b) = 0;
  END;
$$ LANGUAGE plpgsql;

"&&" を関数化する1 (ちょっとだめ)

CREATE FUNCTION ST_MyBoundingBoxOverlap(a GEOMETRY, b GEOMETRY) RETURNS BOOLEAN AS $$
  BEGIN
    RETURN (a && b);
  END;
$$ LANGUAGE plpgsql;

"&&" を関数化する2 (うまくいった)

CREATE OR REPLACE FUNCTION ST_MyBoundingBoxOverlap(GEOMETRY, GEOMETRY) RETURNS BOOLEAN AS $$
  SELECT $1 && $2
$$ LANGUAGE SQL;

考察


GIS


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2014-01-24 (金) 01:05:40 (3972d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=f7be9b3757
ISBN10
ISBN13
9784061426061