2016-05-09 5 views
1

Ich habe Standortdaten mit Zeitstempel versehen.Kombinieren von traditionellen und räumlichen Indizes in Postgres

Ich möchte Postgres effizient Abfragen ausführen, die zeitlich und räumlich begrenzt sind. z.B.

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 

Wie sollte ich dies aus einer Indexierungssicht nähern?

Ich bin verwirrt, weil ich glaube, ich könnte zwischen einem normalen B-Baum-Index auf ts und GIST-Index auf lat/longPOINTs, aber ich brauche einen Composite-Index (oder möglicherweise zwei) wählen muß.

Nehmen Sie ein Jahrzehnt von Daten mit tausend Datensätzen pro Tag an.

(PS Entschuldige Unsinn SQL, habe ich noch nicht von MySQL zu Postgres schaltete - aber die ist eine Postgres Frage.)

+0

Dies ist keine postgis Abfrage. Sie machen nur Vergleiche von Dezimalzahlen und hier gibt es keine geometrischen oder geografischen Felder. – e4c5

Antwort

1

Indizes für dieses bestimmte Tabellenschema können stark davon abhängen, welche Informationen Sie abrufen müssen.

Zum Beispiel kann die Abfrage unten würde wahrscheinlich den Index verwendet effektiv

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

Was machen die "lat/long NOT IN ..." und warum werden sie zusätzlich zur "<@box" benötigt? – fadedbee

+1

@chrisdew der Operator 'Punkt <@box' ist in Gist-Indizes optimiert, aber es ist inklusive. Ihre Beispielabfrage erfordert eine exklusive Abfrage. Daher wird zuerst eine schnelle indizierte integrierte Methode verwendet und anschließend werden alle Punkte herausgefiltert, die tatsächlich den Rahmen der Box berühren. –

1

Die btree_gist Erweiterung ermöglicht es Ihnen, einen Kern-Index auf Zeitstempel zu machen, die machen Es ist möglich, sie mit PostGIS-Indizes zu kombinieren. PostgreSQL kann auch use multiple indexes in einer Abfrage. Sie müssen testen und sehen, welche Kombination am besten funktioniert.

Verwandte Themen