Ich habe eine PostGIS-Abfrage, die mehrere Millionen Zeilen zurückgibt:
SELECT
t1.id AS id1,
t2.id AS id2,
ABS(t1.mean_h - t2.mean_h) AS h_diff,
ST_Distance(t1.the_geom, t2.the_geom) AS dist
FROM tas_ponds as t1, tas_ponds as t2
WHERE
(t1.gid > t2.gid) AND
ST_DWithin(t1.the_geom, t2.the_geom, 17000)
Beim Einlaufen psql
erhalte ich eine out of memory for query result
Fehlermeldung.
Googeln schlägt vor, dass dies eher ein Fehler in psql als in postgres / PostGIS ist. Würde eine Änderung der Abfrage im Formular SELECT ... INTO x FROM ...
das Problem beheben? Gibt es andere empfohlene Ansätze für den Umgang mit sehr großen Datenmengen?
quelle
Für den Datensatz, in meinem Fall das Speichern des zurückgegebenen Datensatzes in einer anderen Tabelle unter Verwendung der
SELECT ... INTO ...
Syntax funktioniert.Es löste nicht nur das Problem mit zu wenig Speicher, sondern war auch wesentlich schneller als die ursprüngliche Abfrage.
quelle
Die Indizierung ist in Postgres und PostGIS sehr wichtig
http://postgis.refractions.net/docs/ch04.html#id2794434
Empfehlen Sie GiST-Indizes (Generalized Search Trees) für sehr große Datasets .... (ist auch "null sicher") Beispiel CREATE INDEX [Indexname] ON [Tabellenname] USING GIST ([Geometriefeld]);
Nach dem Erstellen eines Index ist es wichtig, PostgreSQL zu zwingen, Tabellenstatistiken zu sammeln, die zur Optimierung von Abfrageplänen verwendet werden
VACUUM ANALYZE [Tabellenname] [Spaltenname]; SELECT UPDATE_GEOMETRY_STATS ([Tabellenname], [Spaltenname]);
Eine gute Referenz ist auch: Nutzung von Indizes http://postgis.refractions.net/docs/ch04.html#id2794685
quelle