Message posté par : T. Rossini
----------------------------------------
Salut,
Je pense qu'il y aurait deux moyens d’accélérer votre requête,
sans considération de matériel et de tuning, qui sont bien sûr tres importants:
1) L'organisation de vos données.
Vos données (lignes de bdd) sont organisées en une multitude de fichiers,
que PostgreSQL appelle des "pages".
Un index consiste à indiquer au moteur sur quelle page se trouve (probablement) une
donnée
basée sur une de ses propriétés.
Chaque page indiquée par l'index doit être scannée entièrement pour trouver les lignes
correspondantes.
Plus les lignes concernées par l'index sont éparpillées sur un nombre important de
page,
plus longue sera votre requête, car il faudra autant de lectures de page.
Vous avez donc tout intérêt à ce que les données soient organisées à l'intérieur de
ces fichiers selon un ordre
précis, de manière à minimiser le nombre de page à lire.
Vous avez à votre disposition la commande REINDEX, qui permet de réorganiser les lignes
selon un index ou une fonction.
2) La sous requête utilisant l'operateur de knn.
Je ne crois pas que sous cette forme votre requête tire parti de l'index,
puisqu'aucune des opérandes de <-> n'est une constante,
cf. la doc (
https://postgis.net/docs/geometry_distance_knn.html) :
-----------------
Citation :
Index only kicks in if one of the geometries is a constant (not in a subquery/cte). e.g.
'SRID=3005;POINT(1011102 450541)'::geometry instead of a.geom
-----------------
Pour vous en assurer vous pouvez lancer votre requête en ANALYZE.
Votre requête liste actuellement tout les voisins de chaque points et les ordonne par
distance.
Vous pourriez restreindre la recherche avec un buffer, cela réduira le nombre de ligne à
tester,
et déclenchera sans doute l'utilisation de l'index :
-----------------
Code :
select p.id, t.id_2, t.dist
from centroides_batis_all p cross join lateral(
select r.id as id_2, p.geom <-> r.geom as dist
from centroides_batis_all r
where p.id < r.id
AND st_dwithin(p.geom, r.geom, TAILLE_DU_BUFFER)
order by p.geom <-> r.geom
limit 1) as t
-----------------
Évidemment il faut déterminer la taille du buffer de façon à ce que chaque point
puisse avoir un plus proche voisin. Cela dépends de la distribution géographique
de vos points.
Ensuite, est ce que vos données à vocation a évoluer souvent ?
votre requête est elle exécutée un grand nombre de fois ?
Si la réponse à la première est non et à la seconde est oui,
rien ne vous empêche de créer une colonne identifiant le plus proche voisin
de chaque ligne, ou alors peut être une vue matérialisée.
Vous échangez du temps de calcul contre un peu d'espace disque, ce qui
est un choix qui se fait assez souvent en informatique.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=331774#p331774
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net