Inna opcja, bez potrzeby korzystania z funkcji
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
Podejrzewam (choć nie testowałem), że będzie to szybsze niż użycie funkcji zagnieżdżonej, jak w twoim przykładzie.
Moje wyniki z biegania wyjaśniają (mam nadzieję, że wyglądasz podobnie). Jeśli masz więcej wyników Seq Scan, to jest coś, na co warto zwrócić uwagę, być może indeksy nie są właściwie skonfigurowane.
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 ... Zrobiłem trochę hakowania i odkryłem, że FUNKCJA SQL prowadzi mnie przez większość czasu. Czy ktoś myśli o zabraniu tego na most?
źródło