Message posté par : Nicolas Ribot
----------------------------------------
Bonjour,
Comme vous l'avez vu, BEFORE ou AFTER ne change pas le temps d'execution d'un
trigger: normal: une requete/transaction est finie quand le trigger est entièrement fini.
Un trigger BEFORE sert à changer une valeur de la table sur laquelle agit le trigger (on
veut faire le changement BEFORE l'écriture de nouvelles données)
Un trigger AFTER sert à changer une ou des valeurs d'autres tables que la table sur
laquelle le trigger agit.
Dans votre cas, vous modifiez les champs de la table source, il faut un BEFORE trigger
(d'ailleurs, rien ne se passe dans le cas du AFTER: c'est trop tard pour modifier
NEW, la table est déjà écrite quand le trigger agit).
Concernant la perf, vous avez des index spatiaux sur les tables
(cadastre."PARCELLE" notamment) ? comme vous utilisez st_pointOnSurface sur les
geom des deux tables, il faut que vous créiez des index fonctionnels sur
st_pointOnSurface(geom) pour les deux tables:
-----------------
Code :
create index on schema.table using gist(st_pointOnSurface(geom));
create index on cadastre."PARCELLE" using
gist(st_pointOnSurface("GEOM"));
vacuum analyze schema.table;
vacuum analyze cadastre."PARCELLE";
-----------------
Vérifiez l'usage des index en faisant un explain <query> et en utilisant comme
<query> la même que vous utilisez dans un trigger.
Normalement, ca devrait aller assez vite de trouver des parcelles contenant des points.
(je vous conseille d'utiliser des minuscule pour les noms des tables et colonnes: plus
simple à utiliser, moins source d'erreurs)
Nicolas
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=354698#p354698
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