PostGIS chậm ST_Intersection

Sep 25 2020

Tôi đang cố tìm các điểm giao nhau giữa một đường thẳng và một số đường đồng mức. Sử dụng SQL bên dưới:

DROP TABLE IF EXISTS v_line;
SELECT st_geomfromtext('linestring(103.492217095662 30.9300260311043,103.494817217263 30.9200436767033)',4326) as geom INTO v_line;
SELECT a.gid,a.height, ST_AsText(ST_Intersection(b.geom, a.geom)) 
FROM contour_cb9eba as a,v_line as b 
WHERE ST_Intersects(b.geom,a.geom);

Nhưng truy vấn mất hàng chục giây để hoàn thành. Tôi đã điều chỉnh postgresql, không giúp được gì. Tôi đã tạo chỉ mục trên bảng đường viền, không giúp được gì. Giải thích là bên dưới:

Nested Loop  (cost=0.14..665.47 rows=37 width=44)
  ->  Seq Scan on v_line b  (cost=0.00..23.60 rows=1360 width=32)
  ->  Index Scan using contour_cb9eba_geom_idx on contour_cb9eba a  (cost=0.14..0.41 rows=1 width=746174)
        Index Cond: (b.geom && geom)
        Filter: _st_intersects(b.geom, geom)

phân tích giải thích là bên dưới:

Nested Loop  (cost=0.14..665.47 rows=37 width=44) (actual time=245.343..4629.091 rows=23 loops=1)
  ->  Seq Scan on v_line b  (cost=0.00..23.60 rows=1360 width=32) (actual time=0.011..0.013 rows=1 loops=1)
  ->  Index Scan using contour_cb9eba_geom_idx on contour_cb9eba a  (cost=0.14..0.41 rows=1 width=746174) (actual time=114.466..803.730 rows=23 loops=1)
        Index Cond: (b.geom && geom)
        Filter: _st_intersects(b.geom, geom)
        Rows Removed by Filter: 40
Planning time: 0.235 ms
Execution time: 4629.272 ms

Bảng đường viền chỉ có 82 hàng nhưng có nhiều đỉnh lên đến gần 80000. Có cách nào để làm cho ST_Intersection nhanh hơn không?

Trả lời

1 dr_jts Sep 25 2020 at 11:59

Bạn có thể chia các đường đồng mức thành các đường nhỏ hơn, mang cùng một thông tin thuộc tính không? Khi đó chỉ số không gian sẽ hiệu quả hơn.

Đây là ý tưởng tương tự như khi sử dụng ST_Subdividecho đa giác. Sẽ rất hay nếu có một hàm tương tự cho các dòng, nhưng khá dễ dàng để viết SQL để thực hiện điều này.