답변:
기능이 필요없는 다른 옵션
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
테스트하지는 않았지만 예제와 같이 중첩 함수를 사용하는 것보다 빠를 것이라고 생각합니다.
설명을 실행 한 결과 (아마도 비슷하게 보입니다). 더 많은 Seq Scan 결과를 얻는다면 살펴볼 것이 있습니다. 아마도 인덱스가 제대로 설정되지 않았을 것입니다.
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 ... 약간 해킹을 해본 결과 SQL FUNCTION이 저에게 가장 많은 도움이된다는 것을 알았습니다. 누구든지 이것을 다리로 데려다 줄 생각이 있습니까?
CREATE OR REPLACE FUNCTION getcountry (
country_geom geometry
) RETURNS TABLE(country text) AS $$
SELECT b.name as country FROM
geonames d, world_borders b WHERE
$1 && b.wkb_geometry
AND intersects($1, b.wkb_geometry) ;
$$ LANGUAGE SQL;
UPDATE geonames
SET country = val
FROM (SELECT getcountry(point_geom) FROM geonames) AS val