Bagaimana cara mempercepat kueri untuk database raster?

16

Saya memiliki database raster di postgresql / postgis dengan kolom-kolom ini:

(ID, rast, data_of_data) .

'rast' adalah kolom yang memiliki file raster dalam format WKT. Contoh kueri untuk menemukan nilai DN suatu titik dalam sistem WGS84 (30.424, -1.66) dan untuk 2002-01-09 adalah sebagai berikut:

SELECT 
     st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM 
     my_table
WHERE
     date_of_data='2002-01-09'

Apakah ada metode (mis. Indeks spasial) untuk mempercepat pertanyaan semacam itu?

f.ashouri
sumber
Mungkin Anda bisa membantu kami dengan memberikan detail lebih lanjut: Berapa banyak catatan dalam my_table? Seberapa besar data di kolom raster? Berapa banyak tanggal berbeda yang Anda miliki di date_of_data?
dwurf
Tambahkan ke ini: apa itu SRID dari kolom rast?
dwurf

Jawaban:

12

Ini pertanyaan yang menarik! Seberapa besar raster yang ingin Anda tanyakan? WKTRaster disimpan dalam database sebagai BLOB . Untuk menemukan nilai pada titik tertentu, dari sudut koordinat kolom / baris yang diketahui (x_0, y_0) (i, j) dihitung menggunakan langkah (dx, dy) dan rotasi dan rotasi. Dengan (i, j) diketahui, fungsi ST_Value () dapat mengakses data aktual pada offset byte yang benar.

Ini berarti bahwa DB harus membaca rata-rata setidaknya setengah dari gumpalan data ketika menjawab permintaan untuk suatu titik (tergantung pada implementasinya, ia mungkin benar-benar membaca semua data setiap saat). Karena itu saya akan menebak bahwa kinerja WKTRaster menderita ketika data BLOB menjadi terlalu besar. Ubin dataset harus mempercepat kueri. Lihat bagaimana data SRTM (datang dalam potongan 6000x6000 piksel) ditangani dalam tutorial ini . Mereka benar-benar memasang data menjadi 50x50 piksel sangat kecil, yang merupakan petunjuk jelas bahwa dugaan saya mungkin tidak terlalu jauh dari kebenaran.

Pengindeksan data raster secara spasial mungkin hanya akan mengindeks kotak pembatas, yang sebenarnya tidak membantu untuk masalah Anda.

bhell
sumber
1
Hal ubin tampaknya menjadi cara untuk pergi - lihat tautan ini . Anda juga perlu menambahkan indeks seperti ini: CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));( sumber )
dwurf
4

Dua aspek yang saya temukan mempercepat perhitungan raster PostGIS saya, menggunakan nilai integer dalam raster, dan menggunakan raster multi-band jika memungkinkan. Dalam hal ini, dapatkah nilai DN disimpan sebagai bilangan bulat, jika ini belum dilakukan?

Pikiran lain (dan saya tidak yakin itu relevan di sini) adalah menggunakan raster multi-band. Misalnya, jika Anda melihat potongan data bulanan, setiap bulan bisa menjadi layer raster. Kemudian Anda dapat mengambil beberapa nilai dari suatu titik pada irisan waktu yang berbeda dengan menanyakan raster berlapis. Saya menemukan pendekatan ini lebih cepat daripada meminta raster yang terpisah.

Akhirnya, ketika Anda memuat data Anda ada -t bendera untuk TILE_SIZE . Anda dapat menjelajahi apakah ukuran ubin yang Anda gunakan berfungsi dengan baik untuk kueri Anda.

djq
sumber
Raster multiband kemungkinan akan membantu jika Anda perlu menanyakan nilai piksel yang sama selama beberapa bulan secara bersamaan (untuk tetap menggunakan contoh Anda), misalnya untuk menganalisis deret waktu. Permintaan dalam pertanyaan hanya mengambil satu tanggal tertentu. Jika tanggal itu terkandung dalam satu band, DBMS perlu membaca semua band lainnya juga, meskipun mereka tidak tertarik untuk menjawab pertanyaan. Ini mungkin akan menurunkan kinerja.
bhell
Saya setuju - mungkin saya tidak menekankan bahwa itu hanya berguna jika beberapa nilai dibutuhkan secara bersamaan; Saya akan mengklarifikasi ini.
djq
3

Bergantung pada distribusi data Anda, Anda mungkin mendapatkan beberapa speedup yang sangat baik hanya dengan mengindeks date_of_datakolom.

Anda dapat menggunakan sintaks EXPLAIN ANALYZE untuk mengetahui apakah indeks Anda sedang digunakan atau tidak.

dwurf
sumber
indeks macam apa? Bisakah kamu lebih spesifik?
f.ashouri
Hanya indeks btree standar: create index tbl_name_date_idx on tbl_name (date_of_data). Jika Anda memiliki banyak tanggal yang berbeda, ini akan secara drastis mengurangi jumlah data yang harus diproses PostGIS.
dwurf
Terima kasih, tetapi tidak berhasil untuk permintaan saya.
f.ashouri
Bagaimana itu tidak berhasil? Tidak ada peningkatan kinerja yang nyata, atau masalah lain? Jika Anda memiliki kolom tabel yang secara teratur muncul dalam WHEREklausa, Anda harus selalu mempertimbangkan untuk mengindeksnya. Ini tidak hanya akan membantu dalam kasus ini jika Anda memiliki banyak tanggal yang berbeda (yaitu domain nilai besar) tetapi juga jika Anda memiliki sejumlah besar catatan dalam tabel.
bhell
Apakah kueri menggunakan indeks? Bisakah Anda menempelkan pada keluaran dari explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'?
dwurf