J'ai un ensemble de données national de points d'adresse (37 millions) et un ensemble de données de polygones de contours d'inondation (2 millions) de type MultiPolygonZ, certains des polygones sont très complexes, max ST_NPoints est d'environ 200 000. J'essaie d'identifier à l'aide de PostGIS (2.18) quels points d'adresse se trouvent dans un polygone d'inondation et de les écrire dans une nouvelle table avec l'identifiant de l'adresse et les détails du risque d'inondation. J'ai essayé du point de vue de l'adresse (ST_Within) mais j'ai ensuite échangé cela à partir du point de vue de la zone inondable (ST_Contains), la raison étant qu'il y a de grandes zones sans risque d'inondation du tout. Les deux jeux de données ont été reprojetés en 4326 et les deux tableaux ont un index spatial. Ma requête ci-dessous fonctionne depuis 3 jours maintenant et ne montre aucun signe de fin dans un avenir proche!
select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3
into gb.addresses_with_flood_risk
from gb.flood_risk_areas f, gb.addresses a
where ST_Contains(f.the_geom, a.the_geom);
Existe-t-il un moyen plus optimal de gérer cela? De plus, pour les requêtes à exécution longue de ce type, quelle est la meilleure façon de surveiller les progrès autres que l'examen de l'utilisation des ressources et de pg_stat_activity?
Ma requête d'origine s'est terminée OK bien que pendant 3 jours et j'ai été détourné avec d'autres travaux, donc je n'ai jamais pu consacrer du temps à essayer la solution. Cependant, je viens de revisiter cela et de travailler sur les recommandations, jusqu'ici tout va bien. J'ai utilisé ce qui suit:
- Création d'une grille de 50 km sur le Royaume-Uni à l'aide de la solution ST_FishNet suggérée ici
- Définissez le SRID de la grille générée sur British National Grid et construisez un index spatial sur celle-ci
- Coupé mes données d'inondation (MultiPolygon) en utilisant ST_Intersection et ST_Intersects (seulement obtenu ici, je devais utiliser ST_Force_2D sur le geom car shape2pgsql a ajouté un index Z
- Coupé mes données de point en utilisant la même grille
- Index créés sur la ligne et col et index spatial sur chacune des tables
Je suis prêt à exécuter mon script maintenant, je vais parcourir les lignes et les colonnes en remplissant les résultats dans un nouveau tableau jusqu'à ce que j'aie couvert tout le pays. Mais je viens de vérifier mes données d'inondation et certains des plus grands polygones semblent avoir été perdus en translation! Voici ma requête:
SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom
INTO rofrse.tmp_flood_risk_grid
FROM rofrse.raw_flood_risk f, rofrse.gb_grid g
WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom));
Mes données d'origine ressemblent à ceci:
Cependant, après coupure, cela ressemble à ceci:
Voici un exemple de polygone "manquant":