두 레이어 사이의 교차를 수행하려고합니다.
- 일부 도로를 나타내는 폴리 라인 레이어 (~ 5500 행)
- 다양한 관심 지점 주위에서 불규칙한 모양의 버퍼를 나타내는 다각형 레이어 (~ 47,000 행)
궁극적으로, 내가하려고하는 것은 폴리 라인을 이러한 많은 (때로는 겹치는) 버퍼에 클립 한 다음 각 버퍼에 포함 된 도로의 총 길이를 요약하는 것입니다.
문제는 상황이 느리게 실행되고 있다는 것입니다. 시간이 얼마나 걸리는지 잘 모르겠지만 34 시간이 지난 후에 쿼리가 중단되었습니다. 누군가 내 SQL 쿼리에서 실수를 한 부분을 지적하거나 더 나은 방법을 지적 할 수 있기를 바랍니다.
CREATE TABLE clip_roads AS
SELECT
ST_Intersection(b.the_geom, z.the_geom) AS clip_geom,
b.*
FROM
public."roads" b,
public."buffer1KM" z
WHERE ST_Intersects(b.the_geom, z.the_geom);
CREATE INDEX "clip_roads_clip_geom_gist"
ON "clip_roads"
USING gist
(clip_geom);
CREATE TABLE buffer1km_join AS
SELECT
z.name, z.the_geom,
sum(ST_Length(b.clip_geom)) AS sum_length_m
FROM
public."clip_roads" b,
public."buffer1KM" z
WHERE
ST_Contains(z.the_geom, b.the_geom)
GROUP BY z.name, z.the_geom;
원래 도로 테이블에 대해 GiST 색인을 작성했으며 두 번째 테이블 작성을 수행하기 전에 색인을 작성하십시오.
PGAdmin III의 쿼리 계획은 다음과 같이 보이지만 해석에 많은 기술이 없습니다.
"Nested Loop (cost=0.00..29169.98 rows=35129 width=49364)"
" Output: st_intersection(b.the_geom, z.the_geom), b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
" Join Filter: _st_intersects(b.the_geom, z.the_geom)"
" -> Seq Scan on public."roads" b (cost=0.00..306.72 rows=5472 width=918)"
" Output: b.gid, b.geo_id, b.address_l, b.address_r, b.lf_name, b.lfn_id, b.lfn_name, b.lfn_type_c, b.lfn_type_d, b.lfn_dir_co, b.lfn_dir_de, b.lfn_desc, b.oe_flag_l, b.oe_flag_r, b.fcode_desc, b.fcode, b.fnode, b.tnode, b.metrd_num, b.lo_num_l, b.lo_n_suf_l, b.hi_num_l, b.hi_n_suf_l, b.lo_num_r, b.lo_n_suf_r, b.hi_num_r, b.hi_n_suf_r, b.juris_code, b.dir_code, b.dir_code_d, b.cp_type, b.length, b.the_geom"
" -> Index Scan using "buffer1KM_index_the_geom" on public."buffer1KM" z (cost=0.00..3.41 rows=1 width=48446)"
" Output: z.gid, z.objectid, z.facilityid, z.name, z.frombreak, z.tobreak, z.postal_cod, z.pc_area, z.ct_id, z.da_id, z.taz_id, z.edge_poly, z.cchs_0708, z.tts_06, z.the_geom"
" Index Cond: (b.the_geom && z.the_geom)"
이 작업은 며칠 동안 실행될 예정입니까? 현재 PostGIS for Windows에서 이것을 실행하고 있지만 이론 상으로는 Amazon EC2에 배치하여 문제에 더 많은 하드웨어를 던질 수 있습니다. 그러나 쿼리가 한 번에 하나의 코어 만 사용한다는 것을 알았습니다 (더 많이 사용할 수있는 방법이 있습니까?).