Saya seorang pemula di postgis dan saya memiliki masalah dalam kinerja permintaan.
Ini pertanyaan saya:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
dan masalahnya adalah multipoligon saya termasuk poligon SANGAT besar (panjang 600 halaman dalam kata doc!) dan butuh lebih dari 2 jam untuk mengeksekusi!
Apakah ada cara untuk mengoptimalkan permintaan saya atau menggunakan cara lain?
Tolong bantuan Anda sangat dihargai!
Tergantung jenis kualitas - ketelitian yang Anda butuhkan. Anda jelas dapat menyederhanakan poligon dengan menggunakan: http://postgis.net/docs/ST_Simplify.html
Apa yang sering saya lakukan selama pengembangan aplikasi GIS saya adalah memikirkan cara terbaik untuk meminimalkan data. Misalnya. pilih dulu poligon di dalam kotak batas misalnya. - Bergantung pada tingkat zoom Anda tidak perlu hasil yang sangat presisi (st_simplify) begitu ...
Semoga itu sedikit membantu Anda!
sumber
Bergantung pada keahlian postgres dan / atau sql Anda, Anda memiliki beberapa opsi:
menganalisis kueri melalui perintah EXPLAIN untuk mencari tahu apakah Anda menekan hambatan tertentu. Peringatan: kadang-kadang output EXPLAIN mungkin sulit dipahami
jika Anda berharap bahwa sebagian besar atau sebagian besar geometri dalam tabel1 JANGAN memotong berpoligon, Anda bisa mencoba menerapkan kondisi pendahuluan terhadap poligon yang lebih sederhana (yaitu dengan memecah multiploygon dalam potongan yang lebih kecil) dan kemudian jalankan persimpangan multipoligon yang lebih berat hanya pada hasil tersebut. Lihat di bawah untuk contoh.
jika dan hanya jika CPU adalah hambatan (yaitu server macet di persimpangan komputer) Saya sepenuhnya menyarankan Anda mendapatkan CPU yang lebih besar, lebih cepat, lebih kuat atau menyewa Instance CPU Tinggi satu kali dari EC2 Amazon dan menghancurkannya ketika Anda selesai
Contoh permintaan untuk item 2:Untuk meningkatkan kinerja, Anda juga dapat secara sementara mematerialisasi subselect st1 sebagai tabel sehingga Anda dapat mengindeksnya.@Nicklas benar untuk menunjukkan dalam komentar bahwa contoh untuk saran 2 seharusnya tidak membantu. Dia benar, tapi saya pikir saya juga (sebagian) benar.
Bahkan sepertinya pertanyaan yang sangat mirip ditanyakan (dan dijawab) pada November lalu di postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
dan ternyata sarannya adalah untuk benar-benar memecah poligon sehingga indeks paling efektif dapat memfilter persimpangan palsu yang akan dipicu oleh pemeriksaan batas sederhana.
sumber
MenggunakanST_SubDivide()
Untuk Postgis versi 2.2, Anda dapat menggunakan
ST_SubDivide
.Anda juga bisa
Di sini kita gunakan
ST_SubDivide
untuk memecah poligon menjadi subpoligon dengan 10 atau lebih sedikit simpul.Kemudian
Jangan lakukan hal di atas, itu menyebabkan kesalahan pembulatan
Tuning Umum
Lihat juga bagian yang berjudul Tip Kinerja dalam dokumen. Pastikan Anda disetel dengan tepat. Pertimbangkan meningkatkan
max_parallel_workers_per_gather
untuk memanfaatkan paralelisasi (saat ini default tidak aktif).sumber