Saya menanyakan hal ini karena saya terutama bekerja dengan Oracle tetapi selama setahun terakhir saya telah menggandakan PostGIS dan SQLServer 2008. Sebagian besar fungsi spasial di Oracle tidak akan bekerja tanpa indeks spasial yang mengembalikan kesalahan ORA-13226:
13226, 00000, "antarmuka tidak didukung tanpa indeks spasial" // * Penyebab: Tabel geometri tidak memiliki indeks spasial. // * Tindakan: Pastikan tabel geometri yang dirujuk dalam operator spasial memiliki indeks spasial di atasnya.
Bagi saya ini masuk akal. Anda menjalankan kueri spasial = Anda harus memiliki indeks spasial. Tapi sejauh yang saya mengerti, PostGIS dan SQL Serve tidak memerlukan ini. PostGIS bahkan tampaknya memiliki fungsi (_ * mis. _STContains) yang SECARA EKSPLISIT tidak akan menggunakan indeks spasial.
Jadi pertanyaannya adalah- apakah ada kasus di mana Anda TIDAK boleh menggunakan indeks spasial ?. Tidak harus apakah pendekatan 'ambil atau tinggalkan' yaitu tidak akan membuat perbedaan, tetapi di mana TIDAK menggunakan indeks spasial akan meningkatkan kinerja? Bagi saya, kalimat terakhir adalah kontradiksi dalam hal tetapi sebaliknya mengapa PostGIS akan menyediakan fungsi-fungsi ini?
sumber
Jawaban:
mapoholic,
Secara umum, tidak ada alasan untuk melakukan kueri spasial tanpa indeks spasial kecuali Anda berurusan dengan tabel yang sangat kecil. Meski begitu Anda akan menggunakan ST_ yang tidak menggunakan indeks tetapi memiliki && operator kotak korsleting. fungsi yang dimulai dengan _ST tidak dimaksudkan untuk digunakan oleh pengguna akhir. Alasan mereka ada adalah karena mereka harus. Indeks spasial PostGIS menggunakan inlining SQL untuk memaksa penggunaan indeks - _ST biasanya dilakukan oleh GEOS dan && adalah indeks yang mungkin disusun ulang. Jadi _ST benar-benar merupakan artefak implementasi.
jadi singkatnya - itu bukan satu fungsi sehingga operasi indeks dapat disusun kembali terjadi sekaligus sebelum pemeriksaan spasial lebih intens.
sumber
Jika dataset Anda ditambahkan ke dan sering diperbarui, maka pernyataan INSERT, DELETE dan UPDATE yang menyebabkan indeks dibangun kembali dapat memperlambat database.
Untuk sisipan massal, seperti memuat seluruh dataset OSM ke dalam basis data, mungkin lebih cepat untuk menjatuhkan indeks dan membuatnya lagi setelahnya.
Jika lebih efisien untuk mengabaikan indeks (misalnya tabel cukup kecil untuk dimuat ke dalam memori), prosesor kueri basis data harus melakukan ini secara otomatis.
Saya berharap alasan utama untuk memungkinkan kueri dijalankan tanpa indeks spasial adalah untuk mengukur manfaat kinerja yang Anda dapatkan dengan menggunakan indeks, tanpa harus menjatuhkannya.
Akhirnya jika Anda ingin menunjukkan peningkatan kinerja yang sangat besar ke kueri dan tampilan peta, Anda mungkin ingin menunda membuat indeks ke momen yang tepat dalam pengembangan sistem ...
sumber
Saya pikir ini tersirat, tapi saya TIDAK akan menggunakan indeks spasial untuk kueri ketika saya memiliki indeks non-spasial yang bisa saya gunakan sebagai gantinya. Sebagai contoh, saya memiliki 2.113.450 poin yang menjangkau Amerika Serikat dimuat ke dalam tabel. Jika saya ingin menarik semua titik yang ada di negara bagian Alaska, saya bisa melakukan kueri spasial yang menggunakan indeks GIST pada geometri titik untuk membandingkannya dengan geometri negara bagian Alaska, ATAU, saya hanya bisa menggunakan bidang "state_alpha" dalam data titik (yang juga diindeks) untuk mengembalikan semua poin yang memiliki "state_alpha" = 'AK'.
"Di mana bagian spasial dari ini", Anda bertanya? Nah, jika saya perlu melakukan beberapa analisis spasial lebih lanjut pada Alaska_points setelah saya kumpulkan, lebih cepat mengumpulkan geometri titik tersebut menggunakan kueri non-spasial terlebih dahulu. Ini juga berarti bahwa untuk kumpulan data yang sangat besar, Anda mendapat manfaat dari menambahkan bidang pencarian (atau tabel). Sekali lagi, saya tahu ini mungkin jelas bagi semua orang, saya hanya menyebutkannya karena saya pernah mengalaminya di masa lalu dengan kumpulan data global yang hanya diindeks secara spasial, dan di mana pertanyaan umum adalah "semua fitur di dalam suatu negara". Kami memperoleh banyak kinerja dengan menambahkan bidang country_fips yang diindeks.
Berikut adalah beberapa hasil dari EXPLAIN ANALYZE yang membuktikan maksudnya. (CATATAN: Saya mencoba membuat kueri spasial seefisien mungkin dengan menggunakan kueri BBOX. Menggunakan garis besar status hanya akan membuatnya lebih lambat.)
sumber
Perhatikan pernyataan ini
Bagi saya ini tidak masuk akal sama sekali dan saya pikir SQL Server dan Postgis melakukan pekerjaan yang lebih baik atau setidaknya tidak mengganggu Anda dengan detail kinerja. Bahkan, baik SQL Server dan Postgis kadang-kadang bahkan tidak menggunakan indeks spasial sama sekali (kembali ke pemindaian tabel penuh).
Untuk Oracle, Anda harus membuat indeks dan karena itu Anda harus mengisi user_sdo_geom_metadata.
Hanya membandingkan ini dengan indeks alfanumerik, mereka ada untuk alasan kinerja, pernyataan SQL Anda harus bekerja dengan dan tanpa itu.
Dalam database Oracle, letakkan indeks dan Anda akan mendapatkan banyak kesalahan dan aplikasi yang tidak akan dapat menggunakan kueri spasial, karenanya gagal berfungsi.
sumber