Une autre option, sans avoir besoin de la fonction
update points set country = t1.country from
(
select points.oid, countries.name as country from
countries INNER JOIN points on st_contains(countries.wkb_geometry,points.wkb_geometry)
) t1
where t1.oid = points.oid
Je soupçonne (même si je n'ai pas testé) que ce sera plus rapide que d'utiliser une fonction imbriquée comme dans votre exemple.
Ma sortie de course à pied explique (j'espère que votre look est similaire). Si vous avez plus de résultats Seq Scan, alors c'est quelque chose à regarder, peut-être que les index ne sont pas assez bien configurés.
Update on points (cost=1.18..29.40 rows=121 width=129)"
-> Nested Loop (cost=1.18..29.40 rows=121 width=129)"
Join Filter: _st_contains(countries.geometry, public.points.geometry)"
-> Hash Join (cost=1.18..2.37 rows=28 width=220)"
Hash Cond: (public.points.oid = public.points.oid)"
-> Seq Scan on points (cost=0.00..1.08 rows=28 width=114)"
-> Hash (cost=1.08..1.08 rows=28 width=110)"
-> Seq Scan on points (cost=0.00..1.08 rows=28 width=110)"
-> Index Scan using "countries_Idx" on countries (cost=0.00..0.91 rows=1 width=414)"
Index Cond: (geometry && public.points.geometry)"
OK ... J'ai fait un peu de piratage et j'ai constaté qu'une fonction SQL m'a permis de faire la plupart du chemin. Quelqu'un a-t-il des idées pour amener ça au pont?
la source