Message posté par : Nicolas Ribot
----------------------------------------
Hello !
Je crois que c'est plutot la commande CLUSTER TABLE
(
https://www.postgresql.org/docs/12/sql-cluster.html) qui permet de réorganiser les
données de la table en suivant l'ordre d'un index: lors de l'appel a
l'index, les données qu'il faut aller chercher dans la table sont alors ordonnées
physiquement comme l'index => plus rapide a aller chercher (surtout sur des disques
mécaniques ou la localisation physique des données sur le disque est importante pour la
perf).
Lors de la création, un index est écrit dans le bon ordre par défaut (ordre naturel de
l'operateur d'index).
REINDEX est surtout utile lorsque l'index est cassé, ou que la table a subit de
nombreuses modifs (insert/update/delete).
L'opérateur distance <-> déclenche bien l'usage des index, meme dans le cas
d'un self join. (la partie lateral rendant un des champs constant vis a vis de
l'index, je crois).
C'est bien l'intéret de ce "nouvel" opérateur dans PostGIS. Il évite
d'utiliser des distances ou buffers, qui par nature ne permettent pas de trouver une
réponse exacte: il y a aura tjs un dataset dans lequel la distance min entre deux objets
est supérieure au buffer qu'on utilise. Et si on utilise un trop gros buffer,
l'index n'est plus selectif et donc inutile.
Le plan de la requête KNN:
-----------------
Code :
QUERY PLAN
Nested Loop (cost=0.29..571924.24 rows=1000000 width=48) (actual time=0.275..125458.410
rows=999999 loops=1)
Output: p.id, r.id, ((p.geom <-> r.geom)), st_makeline(p.geom, r.geom)
Buffers: shared hit=15148569
-> Seq Scan on work_nico.testpt p (cost=0.00..18264.00 rows=1000000 width=36)
(actual time=0.011..88.278 rows=1000000 loops=1)
Output: p.geom, p.id
Buffers: shared hit=8264
-> Limit (cost=0.29..0.53 rows=1 width=44) (actual time=0.124..0.124 rows=1
loops=1000000)
Output: r.id, ((p.geom <-> r.geom)), r.geom
Buffers: shared hit=15140305
-> Index Scan using testpt_geom_gist on work_nico.testpt r
(cost=0.29..82053.62 rows=333333 width=44) (actual time=0.124..0.124 rows=1
loops=1000000)
Output: r.id, (p.geom <-> r.geom), r.geom
Order By: (r.geom <-> p.geom)
Filter: (p.id < r.id)
Rows Removed by Filter: 11
Buffers: shared hit=15140305
Planning time: 0.350 ms
Execution time: 125517.935 ms
-----------------
(la meme requete, sur 10000 lignes au lieu de 1M, sans index, prend deja 33s)
Nico
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=331775#p331775
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