複雑なクエリ

空間データベース機能性の存在理由(raison d'etre)は,通常デスクトップGISの機能性に要求されるデータベースにおけるクエリの実行です.PostGISを効果的に利用するには,どんな空間関数が利用できるかを知っていることと,良いパフォーマンスを提供するための適切なインデックスが確保されていることが要求されます.

インデックスの利点の獲得

クエリを組み立てるとき,&&のようなbounding-boxベースの演算子だけがGiST空間インデックスの利点が得られることを覚えておくことは重要です.distance()のような関数は,その操作を最適化する為にインデックスを使うことはできません.例えば,以下のクエリは大きなテーブルではかなり遅くなるでしょう:

  SELECT the_geom FROM geom_table
  WHERE distance( the_geom, GeometryFromText( 'POINT(100000 200000)', -1 ) ) < 100

このクエリは点(100000, 200000)から100単位以内にあるgeom_table中の全てのジオメトリを選択します.それは,テーブル中の各点と指定した点との距離を計算する,すなわち,テーブルの各行に対して一つのdistance()が計算されるので遅くなるでしょう.要求される距離計算の数を減らすために&&演算子を使うことで,これを避けることができます:

  SELECT the_geom FROM geom_table
  WHERE the_geom && 'BOX3D(90900 190900, 100100 200100)'::box3d
    AND distance( the_geom, GeometryFromText( 'POINT(100000 200000)', -1 ) ) < 100

このクエリは同じジオメトリを選択しますが,より効果的な方法でそれを実行します.the_geomにGiSTインデックスがあると仮定すると,クエリプランナはdistance()関数の結果を計算する前に,行数を減らすためにインデックスを使うことができることを認識するでしょう.&&演算子で使われているBOX3Dジオメトリが,オリジナルの点を中央にもつ200単位の正方形であることに注意してください--これが"query box"です.&&演算子は,"query box"に重なるbounding boxをもつジオメトリだけに結果集合をすばやく減らすためにインデックスを用います.query boxがジオメトリテーブル全体の範囲よりとても小さいと仮定すると,実行に必要な距離計算の数を大幅に減らすことができるでしょう.