Wie können Abfragen für Raster-Datenbanken beschleunigt werden?

16

Ich habe eine Rasterdatenbank in postgresql / postgis mit diesen Spalten:

(ID, Raster, Daten_der_Daten) .

'rast' ist die Spalte, die Rasterdateien im WKT-Format enthält. Eine Beispielabfrage zum Ermitteln des DN-Werts eines Punkts im WGS84-System (30.424, -1.66) und für den 09.01.2002 lautet wie folgt:

SELECT 
     st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM 
     my_table
WHERE
     date_of_data='2002-01-09'

Gibt es eine Methode (z. B. räumlicher Index), um diese Art von Abfragen zu beschleunigen?

f.ashouri
quelle
Vielleicht könnten Sie uns helfen, indem Sie weitere Details angeben: Wie viele Datensätze befinden sich in my_table? Wie groß sind die Daten in der Rasterspalte? Wie viele unterschiedliche Daten haben Sie in date_of_data?
Dwurf
Fügen Sie Folgendes hinzu: Was ist die SRID der Raster-Spalte?
Dwurf

Antworten:

12

Das ist eine spannende Frage! Wie groß ist das Raster, das Sie abfragen möchten? WKTRaster wird als BLOB in der Datenbank gespeichert . Um den Wert an einem bestimmten Punkt zu finden, werden aus einer bekannten (x_0, y_0) Eckenkoordinate Zeilen- / Spaltenindizes (i, j) unter Verwendung von (dx, dy) Schritten und Rotation berechnet. Wenn (i, j) bekannt ist, kann die Funktion ST_Value () mit dem richtigen Byte-Offset auf die tatsächlichen Daten zugreifen.

Dies bedeutet, dass der DB bei der Beantwortung einer Anfrage nach einem Punkt im Durchschnitt mindestens die Hälfte des Datenblobs lesen muss (je nach Implementierung kann er tatsächlich alle Daten jederzeit lesen). Ich würde daher vermuten, dass die Leistung von WKTRaster leidet, wenn die Daten-BLOBs zu groß werden. Durch Kacheln des Datasets sollten Abfragen beschleunigt werden. Sehen Sie sich in diesem Lernprogramm an, wie SRTM-Daten (in 6000 x 6000 Pixel großen Blöcken) verarbeitet werden . Sie kacheln die Daten tatsächlich in wirklich kleine 50 x 50 Pixel, was ein klarer Hinweis darauf ist, dass meine Vermutung möglicherweise nicht zu weit von der Wahrheit entfernt ist.

Durch die räumliche Indizierung von Rasterdaten wird wahrscheinlich nur der Begrenzungsrahmen indiziert, was für Ihr Problem keine wirkliche Hilfe darstellt.

bhell
quelle
1
Die Sache mit den Kacheln scheint der richtige Weg zu sein - siehe diesen Link . Sie müssen auch einen Index wie diesen hinzufügen: CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));( source )
dwurf
4

Zwei Aspekte, die meine PostGIS-Raster-Berechnungen beschleunigten, waren die Verwendung von Ganzzahlwerten im Raster und die Verwendung von Multiband-Rastern, wo immer dies möglich war. Kann in diesem Fall der DN-Wert als Ganzzahl gespeichert werden, wenn dies noch nicht geschehen ist?

Der andere Gedanke (und ich bin mir nicht sicher, ob er hier relevant ist) ist die Verwendung von Multiband-Rastern. Wenn Sie sich beispielsweise monatliche Datenscheiben ansehen, kann jeder Monat eine Rasterebene sein. Anschließend können Sie mehrere Werte eines Punkts zu verschiedenen Zeitpunkten abrufen, indem Sie das geschichtete Raster abfragen. Ich fand, dass dieser Ansatz viel schneller ist, als separate Raster abzufragen.

Schließlich gibt es beim Laden Ihrer Daten das -tFlag für TILE_SIZE . Sie können untersuchen, ob die von Ihnen verwendete Kachelgröße für Ihre Abfrage geeignet ist.

djq
quelle
Multiband-Raster sind wahrscheinlich hilfreich, wenn Sie den gleichen Pixelwert für mehrere Monate gleichzeitig abfragen müssen (um an Ihrem Beispiel festzuhalten), z. B. um Zeitreihen zu analysieren. Die Abfrage in der Frage ruft nur ein bestimmtes Datum ab. Wenn das Datum in einem Band enthalten wäre, müsste das DBMS auch alle anderen Bänder lesen, auch wenn sie für die Beantwortung der Anfrage nicht von Interesse sind. Dies würde wahrscheinlich die Leistung verschlechtern.
Bhell
Ich stimme zu - vielleicht habe ich nicht betont, dass es nur sinnvoll ist, wenn mehrere Werte gleichzeitig benötigt werden; Ich werde das klären.
djq
3

Abhängig von der Verteilung Ihrer Daten erzielen Sie möglicherweise einige sehr gute Beschleunigungen, wenn Sie nur die date_of_dataSpalte indizieren .

Mit der EXPLAIN ANALYZE- Syntax können Sie herausfinden, ob Ihre Indizes verwendet werden oder nicht.

dwurf
quelle
Was für ein Index? Könntest du genauer sein?
f.ashouri
Nur ein Standard btree Index: create index tbl_name_date_idx on tbl_name (date_of_data). Wenn Sie viele unterschiedliche Daten haben, wird dies die Datenmenge, die PostGIS verarbeiten muss, drastisch reduzieren.
Dwurf
Vielen Dank, aber es hat bei meiner Anfrage nicht geklappt.
f.ashouri
Wie hat es nicht funktioniert? Kein merklicher Leistungszuwachs oder andere Probleme? Wenn Sie eine Tabellenspalte haben, die regelmäßig in einer WHEREKlausel erscheint, sollten Sie immer in Betracht ziehen, diese zu indizieren. In diesem Fall ist es nicht nur hilfreich, wenn Sie viele unterschiedliche Daten haben (z. B. eine große Wertedomäne), sondern auch, wenn Sie eine große Anzahl von Datensätzen in der Tabelle haben.
Bhell
Verwendet die Abfrage den Index? Können Sie die Ausgabe von einfügen explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'?
Dwurf