다각형 쿼리에서 매우 큰 점 최적화


9

주소 포인트 (37 백만)의 국가 데이터 세트와 MultiPolygonZ 유형의 플러드 아웃 라인 (2 백만)의 다각형 데이터 세트가 있으며 일부 폴리곤은 매우 복잡하며 최대 ST_NPoints는 약 200,000입니다. 홍수 다각형에있는 주소 지점이 PostGIS (2.18)를 사용하여 식별하고 주소 ID 및 홍수 위험 세부 정보가있는 새 테이블에 기록하려고합니다. 주소 관점 (ST_Within)에서 시도했지만 홍수 지역 관점 (ST_Contains)에서 시작하여 이것을 대체했습니다. 이유는 홍수 위험이 전혀없는 넓은 지역이 있다는 이론적 근거입니다. 두 데이터 세트 모두 4326으로 ​​재 투영되었으며 두 테이블 모두 공간 인덱스가 있습니다. 아래 쿼리가 3 일 동안 실행되었으며 조만간 완료 될 조짐이 없습니다!

select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3
into gb.addresses_with_flood_risk
from gb.flood_risk_areas f, gb.addresses a
where ST_Contains(f.the_geom, a.the_geom);

이것을 실행하는 더 최적의 방법이 있습니까? 또한이 유형의 장기 실행 쿼리의 경우 리소스 사용률 및 pg_stat_activity를 보는 것 외에 진행률을 모니터링하는 가장 좋은 방법은 무엇입니까?


내 원래의 쿼리는 3 일 동안 확인을 마쳤지만 다른 작업과 관련이 없어서 솔루션을 시험해 볼 시간을 결코 낭비하지 않았습니다. 그러나 나는 이것을 다시 방문하여 지금까지 권장 사항을 검토했습니다. 나는 다음을 사용했다.

  1. 여기에 제안 된 ST_FishNet 솔루션을 사용하여 영국에 50km 그리드를 생성했습니다.
  2. 생성 된 그리드의 SRID를 British National Grid로 설정하고 공간 인덱스를 빌드하십시오.
  3. ST_Intersection 및 ST_Intersects를 사용하여 내 홍수 데이터 (MultiPolygon)를 잘랐습니다 (shape2pgsql이 Z 색인을 추가함에 따라 기하에 ST_Force_2D를 사용해야했습니다)
  4. 동일한 그리드를 사용하여 내 포인트 데이터를 클리핑
  5. 행에 대한 색인 작성 및 각 테이블에 대한 공간 색인 및 공간 색인

이제 스크립트를 실행할 준비가되었습니다. 국가 전체를 다룰 때까지 결과를 채우는 행과 열을 새 테이블로 반복합니다. 그러나 방금 홍수 데이터를 확인했으며 가장 큰 다각형 중 일부가 번역에서 손실 된 것으로 보입니다! 이것은 내 쿼리입니다.

SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom 
INTO rofrse.tmp_flood_risk_grid 
FROM rofrse.raw_flood_risk f, rofrse.gb_grid g
WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom));

내 원본 데이터는 다음과 같습니다.

원래 홍수 데이터

그러나 포스트 클리핑은 다음과 같습니다.

그리드 홍수 데이터

다음은 "누락 된"다각형의 예입니다.

"없는"다각형


나는 우리가 서울의 FOSS4G에서 만났고 ESRI 로케이터 허브의 경이에 대해 이야기했다는 것을 깨달았습니다 :-)
John Powell

분할 및 정복 접근법을 완료 한 적이 있습니까? 이 방법으로 벤치 마크 시간을 업데이트 할 수 있습니까?
앤드류

답변:


6

마지막 질문에 먼저 답하려면 이 게시물을 참조하십시오.쿼리 진행 상황을 모니터링 할 수있는 것이 바람직합니다. 기본 테이블 스캔 구현의 루프 카운터에서 얻을 수있는 플러드 폴리곤의 포함에 대해 주소의 99 %가 이미 스캔되어 있음을 알기 때문에 문제는 어렵고 공간 쿼리에서 복잡해질 수 있습니다. 주소의 마지막 1 %가 가장 많은 점이있는 플러드 다각형과 교차하는 경우 이전 99 %가 작은 영역과 교차하는 경우 도움이됩니다. 이것은 EXPLAIN이 때때로 공간에 도움이되지 않는 이유 중 하나입니다. 스캔 될 행을 표시하지만 명백한 이유로 다각형의 복잡성을 고려하지 않기 때문에 (따라서 큰 비율) 교차 / 교차 유형 쿼리의

두 번째 문제는 다음과 같은 것을 보면

EXPLAIN 
SELECT COUNT(a.id) 
FROM sometable a, someothertable b
WHERE ST_Intersects (a.geom, b.geom)

많은 세부 정보를 놓친 후 다음과 같은 내용이 표시됩니다.

_st_intersects(a.geom, b.geom)
   ->  Bitmap Index Scan on ix_spatial_index_name  (cost...rows...width...))
   Index Cond: (a.geom && geom)

최종 조건 &&는 실제 지오메트리의보다 정확한 교차를 수행하기 전에 경계 상자 확인을 의미합니다. 이것은 분명히 합리적이며 R- 트리가 작동하는 방식의 핵심입니다. 그러나 과거에 영국의 홍수 데이터에 대해서도 연구 한 적이 있기 때문에 (다중) 다각형이 매우 광범위하면 데이터 구조에 익숙합니다. 도-거대한 경계 상자가 생겨 매우 복잡한 다각형에서 수많은 잠재적 교차점이 확인 될 수 있습니다.

"내 쿼리가 3 일 동안 실행되었고 1 % 또는 99 %인지 알 수 없음" 문제에 대해 생각해 낸 유일한 해결책 은 일종의 나누기를 사용하여 인형을 정복하는 것입니다. 즉, plpgsql의 루프 또는 콘솔에서 명시 적으로 영역을 작은 덩어리로 나누고 별도로 실행합니다. 이는 복잡한 다각형을 부품으로자를 수 있다는 장점이 있습니다. 이는 다각형 검사의 후속 지점이 작은 다각형에서 작동하고 다각형의 경계 상자가 훨씬 작다는 것을 의미합니다.

영국 전체에서 일주일 이상 실행 된 쿼리를 종료 한 후 영국을 50km x 50km 블록으로 나눠서 하루에 쿼리를 실행했습니다. 제쳐두고, 위의 쿼리가 SELECT가 아닌 CREATE TABLE 또는 UPDATE이기를 바랍니다. 플러드 다각형에 기반한 하나의 테이블, 주소를 업데이트 할 때는 업데이트되는 전체 테이블과 주소를 스캔해야하므로 실제로 공간 인덱스를 갖는 것은 전혀 도움이되지 않습니다.

편집 : 이미지가 천 단어의 가치가 있음을 기초로 다음은 영국 홍수 데이터의 이미지입니다. 경계 상자가 전체 면적을 덮는 매우 큰 다중 다각형이 하나 있으므로, 예를 들어 먼저 홍수 다각형을 붉은 격자와 교차시킴으로써 남서쪽 ​​모서리의 정사각형이 갑자기 테스트되는 방법을 쉽게 알 수 있습니다. 다각형의 작은 하위 집합에 대해

여기에 이미지 설명을 입력하십시오


안녕하세요 존과 포괄적 인 답변에 대해 대단히 감사합니다. 그리드 접근법에 대한 귀하의 제안을 따르겠습니다. 매우 합리적인 제안처럼 들립니다. 정확하고 단순화하고 싶지 않습니다. 하나의 블록으로 벤치마킹 한 다음 병렬로 실행하면 요즘 클라우드로 훨씬 더 쉬워집니다! 다시 한번 감사드립니다
Mark Varley

안녕하세요, 걱정하지 마십시오. 도움이되었다고 생각되면 답변을 받아들이십시오. 사이트를 깨끗하게 유지하는 데 도움이됩니다. 수락 된 답변이없는 질문은 스택 교환 사이트가 보는 메트릭 중 하나입니다.
John Powell

모두 다 끝났습니다. 이것은 여기의 첫 번째 게시물입니다. 보통 자세한 스레드와 유용한 답변에서 답변을 찾습니다. 쿼리는 오늘 아침 약 3 일 후에 끝났는데, 이는 나쁘지 않지만 오늘 조언을 따르고 더 나은 성능을 위해 덩어리로 나눕니다. 도움 John에게 다시 한 번 감사 드리며 8 월 Bonn에서 you겠습니다!
Mark Varley

사진을 추가했는데 사진이 있다는 것을 알고 있습니다. : D, 다른 사람들이 내가 현재하고있는 것을 시각화하는 데 도움이 될 수 있습니다. 네, 거의 확실하게 Foss4G UK에 갈 예정이며 Bonn에 대해 생각할 것입니다.
존 파월
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.