Je suis un débutant en postgis et j'ai un problème de performances de requête.
Cette ma requête:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
et le problème est que mon multipolygone comprend de TRÈS grands polygones (600 pages de long en document Word!) et il a fallu plus de 2 heures pour l'exécuter!
Existe-t-il un moyen d'optimiser ma requête ou d'utiliser une autre méthode?
Veuillez votre aide est grandement appréciée!
Cela dépend du type de qualité - précision dont vous avez besoin. Vous pouvez évidemment simplifier les polygones en utilisant: http://postgis.net/docs/ST_Simplify.html
Ce que j'ai souvent fait lors du développement de mon application SIG, c'était de réfléchir à la meilleure façon de minimiser les données. Par exemple. présélectionnez les polygones dans la zone de contour par exemple. - Selon le niveau de zoom, vous n'avez pas besoin de résultats ultra précis (st_simplify) etc.
J'espère que cela vous a aidé un peu!
la source
Selon votre expertise postgres et / ou sql vous avez plusieurs options:
analyser la requête via la commande EXPLAIN pour savoir si vous rencontrez un goulot d'étranglement particulier. Attention: parfois la sortie d'EXPLAIN peut être difficile à comprendre
si vous vous attendez à ce que la plupart ou une partie importante des géométries du tableau 1 n'intersectent pas le multipolygone, vous pouvez essayer d'appliquer une condition préliminaire à un polygone plus simple (c'est-à-dire en cassant le multiploygon en morceaux plus petits), puis exécuter l'intersection de multipolygone plus lourde uniquement sur ces résultats. Voir ci-dessous pour un exemple.
si et seulement si le CPU est le goulot d' étranglement (le serveur est intersections de calcul Stück) Je sourdement vous suggère de faire un plus grand, plus rapide, processeur plus puissant ou louer un haut-CPU unique instance de EC2 d'Amazon et détruis quand vous êtes terminé
Exemple de requête pour l'élément 2:Pour améliorer les performances, vous pouvez également matérialiser temporairement la sous-sélection st1 en tant que table afin de pouvoir l'indexer.@Nicklas a raison de souligner dans les commentaires que l'exemple de la suggestion 2 ne devrait pas aider. Il a raison, mais je pense que j'ai (en partie) raison aussi.
En fait, il semble qu'une question très similaire ait été posée (et répondue) en novembre dernier sur le postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
et il s'avère que la suggestion est de réellement décomposer le polygone afin que l'index puisse filtrer le plus efficacement les fausses intersections qui seraient autrement déclenchées par une simple vérification des limites.
la source
En utilisantST_SubDivide()
Pour la version 2.2 de Postgis, vous pouvez utiliser
ST_SubDivide
.Vous pouvez aussi
Ici, nous utilisons
ST_SubDivide
pour décomposer le polygone en sous-polygones avec 10 sommets ou moins.alors
Ne faites pas ce qui précède, cela introduit des erreurs d'arrondi
Réglage général
Consultez également la section intitulée Conseils sur les performances dans la documentation. Assurez-vous que vous êtes réglé correctement. Pensez à augmenter
max_parallel_workers_per_gather
pour profiter de la parallélisation (actuellement désactivé par défaut).la source