Eu tenho uma consulta PostGIS que retornará vários milhões de linhas:
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)
Quando executado psql
, recebo um out of memory for query result
erro.
O Google sugere que isso seja um erro no psql, em vez de no postgres / PostGIS. Alterar a consulta no formulário SELECT ... INTO x FROM ...
resolveria o problema? Existem outras abordagens recomendadas para lidar com conjuntos de dados muito grandes?
fonte
Para o registro, no meu caso, armazenar o conjunto de dados retornado em outra tabela usando a
SELECT ... INTO ...
sintaxe trabalhada.Ele não apenas resolveu o problema de falta de memória, mas também foi substancialmente mais rápido que a consulta original.
fonte
A indexação é muito importante no Postgres e PostGIS
http://postgis.refractions.net/docs/ch04.html#id2794434
Recomende índices GiST (Árvores de Pesquisa Generalizada) para conjuntos de dados muito grandes .... (também é "nulo seguro") exemplo CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield]);
Após criar um índice, é importante forçar o PostgreSQL a coletar estatísticas da tabela, que são usadas para otimizar os planos de consulta
ANÁLISE DE VÁCUO [nome_tabela] [nome_coluna]; SELECT UPDATE_GEOMETRY_STATS ([table_name], [column_name]);
Também é uma boa referência: Aproveitando os índices http://postgis.refractions.net/docs/ch04.html#id2794685
fonte