Saya memiliki permintaan PostGIS yang akan mengembalikan beberapa juta baris:
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)
Saat dijalankan psql
, saya mendapatkan out of memory for query result
kesalahan.
Googling menyarankan bahwa ini merupakan kesalahan dalam psql daripada postgres / PostGIS. Akankah mengubah kueri ke dalam formulir SELECT ... INTO x FROM ...
memperbaiki masalah? Apakah ada pendekatan lain yang direkomendasikan untuk menangani dataset yang sangat besar?
sumber
Sebagai catatan, dalam kasus saya menyimpan dataset yang dikembalikan di tabel lain menggunakan
SELECT ... INTO ...
sintaks bekerja.Itu tidak hanya memecahkan masalah kehabisan memori, tetapi juga secara substansial lebih cepat dari permintaan asli.
sumber
Pengindeksan sangat penting dalam Postgres dan PostGIS
http://postgis.refractions.net/docs/ch04.html#id2794434
Rekomendasikan indeks GiST (Generalized Search Trees) untuk dataset yang sangat besar .... (juga "null safe") contoh CREATE INDEX [indexname] ON [tablename] MENGGUNAKAN GIST ([geometryfield]);
Setelah membangun indeks, penting untuk memaksa PostgreSQL untuk mengumpulkan statistik tabel, yang digunakan untuk mengoptimalkan rencana kueri
VACUUM ANALYZE [table_name] [column_name]; SELECT UPDATE_GEOMETRY_STATS ([table_name], [column_name]);
referensi yang bagus adalah: Mengambil Keuntungan dari Indeks http://postgis.refractions.net/docs/ch04.html#id2794685
sumber