2016-05-09 7 views
1

タイムスタンプを付けたデータがあります。Postgresの伝統的なインデックスと空間インデックスの組み合わせ

私はPostgresが時間と空間に縛られたクエリを効率的に実行したいと思っています。例えば

select * 
from tracking_tags 
where ts >= '1990-01-01T00:00:00.000Z' 
and ts < '2000-01-01T00:00:00.000Z' 
and lat > 40.0 
and lat < 50.0 
and long < 0.0 
and long > -10.0 

私はインデックスの観点からこれをどのようにアプローチする必要がありますか?

私はlat/longPOINTsts上、通常のBツリー索引とGISTのインデックスのどちらかを選択する必要があるかもしれませんが、私は複合インデックス(あるいは2)が必要だと思うので、私は混乱しています。

1日あたり1000レコードの10年間のデータを想定します。

(PS謝罪はナンセンスSQLのために、私はまだPostgresのにMySQLの切り替えしていない - しかし、このはPostgresの質問である。)

+0

これは、PostGISのクエリではないインデックスを使用します。小数点の比較をしているだけで、ジオメトリや地理フィールドはありません。 – e4c5

答えて

1

この特定の表スキーマの索引は、取得する必要のある情報によって大きく異なる可能性があります。

たとえば、次のクエリはおそらく効果的

CREATE INDEX ON tracking_tags USING gist (point(lat,long), ts); 

SELECT * 
FROM tracking_tags 
WHERE point(lat,long) <@ box(point(40,-10),point(50,0)) AND 
     ts <@ tstzrange'[1990-01-01,2000-01-01)' AND 
     lat NOT IN (40, 50) AND long NOT IN (-10, 0); 
+0

"緯度/経度NOT IN ..."は何を行い、なぜ "<@ box"に追加する必要があるのですか? – fadedbee

+1

@chrisdew演算子 'point <@box'は、要点インデックスで最適化されていますが、それだけではありません。サンプルクエリは排他的なものである必要があります。そのため、最初は高速なインデックス付きインクルーシブアプローチを使用してから、実際にボックスのフレームに接触しているポイントを除外します。 –

1

btree_gist拡張子は、あなたが行うタイムスタンプのGiSTインデックスを作成することができますそれらをPostGISインデックスと組み合わせることが可能です。 PostgreSQLはuse multiple indexesも1つのクエリで行うことができます。どのコンビネーションがベストを演じるかをテストして調べる必要があります。

関連する問題