Một tùy chọn khác, không cần chức năng
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
Tôi nghi ngờ (mặc dù tôi chưa thử nghiệm) rằng điều này sẽ nhanh hơn việc sử dụng hàm lồng nhau như trong ví dụ của bạn.
Đầu ra của tôi từ chạy giải thích (hy vọng bạn trông tương tự). Nếu bạn đã có nhiều kết quả Seq Scan hơn, thì đó là điều cần xem xét, có lẽ các chỉ mục không được thiết lập đúng.
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)"