Saya mencoba melakukan persimpangan antara dua lapisan:
- Lapisan polyline mewakili beberapa jalan (~ 5500 baris)
- Lapisan poligon mewakili buffer berbentuk tidak teratur di sekitar berbagai tempat menarik (~ 47.000 baris)
Pada akhirnya, apa yang saya coba lakukan adalah untuk memotong polylines ke banyak (kadang tumpang tindih) buffer ini, dan kemudian meringkas total panjang jalan yang terkandung dalam setiap buffer.
Masalahnya adalah bahwa semuanya berjalan lambat. Saya tidak yakin berapa lama ini harus dilakukan, tetapi saya baru saja membatalkan permintaan saya setelah> 34 jam. Saya berharap bahwa seseorang dapat menunjukkan di mana saya telah membuat kesalahan dengan permintaan SQL saya, atau dapat mengarahkan saya ke cara yang lebih baik untuk melakukan ini.
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;
Saya memiliki indeks GiST yang dibuat untuk tabel jalan asli, dan (hanya untuk aman?) Membuat indeks sebelum melakukan pembuatan tabel kedua.
Rencana kueri dari PGAdmin III terlihat seperti ini, meskipun saya khawatir saya tidak memiliki banyak keterampilan dalam menafsirkannya:
"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)"
Apakah operasi ini hanya akan berjalan selama beberapa hari? Saya saat ini menjalankan ini pada PostGIS untuk Windows, tetapi secara teori saya dapat melemparkan lebih banyak perangkat keras pada masalah dengan meletakkannya di Amazon EC2. Namun, saya melihat bahwa kueri hanya menggunakan satu inti pada satu waktu (apakah ada cara untuk membuatnya menggunakan lebih banyak?).
sumber
Jawaban:
Peter,
Versi PostGIS, GEOS, dan PostgreSQL apa yang Anda gunakan?
lakukan a
SELECT postgis_full_version (), version ();
Banyak perangkat tambahan telah dibuat antara 1,4 dan 1,5 dan GEOS 3,2+ untuk hal semacam ini.
Juga berapa banyak simpul yang dimiliki poligon Anda?
Lakukan a
SELECT Max (ST_NPoints (the_geom)) Sebagai maks FROM kadang-kadang;
Untuk memahami skenario terburuk Anda. Kecepatan lambat seperti ini sering disebabkan oleh geometri yang akhirnya berbutir. Dalam hal ini Anda mungkin ingin menyederhanakan terlebih dahulu.
Anda juga sudah optimalkan file postgresql.conf Anda?
sumber
jawaban pertukaran tumpukan yang bermanfaat: /programming/1162206/why-is-postgresql-so-slow-on-windows
Tuning postgres: http://wiki.postgresql.org/wiki/Performance_Optimization
dari pengalaman merekomendasikan VACUUM ANALYZE
sumber
Steker tak tahu malu :) Tolong bantu untuk membaca bab 8 dan bab 9 buku kami. Hanya panas dari mesin cetak. Kami membahas banyak pertanyaan semacam ini di bab-bab itu.
http://www.postgis.us/chapter_08
http://www.postgis.us/chapter_09
sumber
Lihat dua tips untuk mengoptimalkan kueri spasial. Mereka bekerja sangat baik untuk saya. http://kb.zillionics.com/optimize-spatial-query/
sumber