Gambaran Umum Indeks Spasial
Berlaku untuk: Database SQL ServerAzure SQL Database Azure SQL Managed Instance SQL di Microsoft Fabric
SQL Server mendukung data spasial dan indeks spasial. Indeks spasial adalah jenis indeks yang diperluas yang memungkinkan Anda mengindeks kolom spasial. Kolom spasial adalah kolom tabel yang berisi data jenis data spasial, seperti geometri atau geografi.
Tip
Alat spasial SQL Server adalah kumpulan alat sumber terbuka yang disponsori Microsoft untuk digunakan dengan jenis spasial di SQL Server. Proyek ini menyediakan serangkaian fungsi yang dapat digunakan kembali yang dapat digunakan aplikasi. Fungsi-fungsi ini dapat mencakup rutinitas konversi data, transformasi baru, agregat, dll. Lihat Microsoft/SQLServerSpatialTools di GitHub untuk detail selengkapnya.
Tentang Indeks Spasial
Menguraikan Ruang Terindeks ke dalam Hierarki Kisi
Di SQL Server, indeks spasial dibangun menggunakan pohon B, yang berarti bahwa indeks harus mewakili data spasial 2 dimensi dalam urutan linier pohon B. Oleh karena itu, sebelum membaca data ke dalam indeks spasial, SQL Server menerapkan dekomposisi ruang seragam hierarkis. Proses pembuatan indeks menguraikan spasi menjadi hierarki kisi empat tingkat. Tingkat ini disebut sebagai tingkat 1 (tingkat atas), tingkat 2, tingkat 3, dan tingkat 4.
Setiap tingkat berturut-turut semakin menguraikan tingkat di atasnya, sehingga setiap sel tingkat atas berisi kisi lengkap di tingkat berikutnya. Pada tingkat tertentu, semua kisi memiliki jumlah sel yang sama di sepanjang kedua sumbu (misalnya, 4x4 atau 8x8), dan sel semuanya berukuran satu.
Ilustrasi berikut menunjukkan dekomposisi untuk sel kanan atas di setiap tingkat hierarki kisi ke dalam kisi 4x4. Pada kenyataannya, semua sel diurai dengan cara ini. Jadi, misalnya, menguraikan spasi menjadi empat tingkat kisi 4x4 benar-benar menghasilkan total 65.536 sel tingkat empat.
Catatan
Penguraian ruang untuk indeks spasial tidak bergantung pada satuan pengukuran yang digunakan data aplikasi.
Sel hierarki kisi diberi nomor dalam mode linier dengan menggunakan variasi kurva pengisian ruang Hilbert. Namun, untuk tujuan ilustrasi, diskusi ini menggunakan penomoran baris-bijaksana sederhana, alih-alih penomoran yang sebenarnya diproduksi oleh kurva Hilbert. Dalam ilustrasi berikut, beberapa poligon yang mewakili bangunan, dan garis yang mewakili jalanan, telah ditempatkan ke dalam kisi 4x4, tingkat-1. Sel tingkat 1 dinomor dari 1 hingga 16, dimulai dengan sel kiri atas.
Kepadatan Kisi
Jumlah sel di sepanjang sumbu kisi menentukan kepadatannya: semakin besar jumlahnya, kisi akan lebih padat. Misalnya, kisi 8x8 (yang menghasilkan 64 sel), lebih padat dari kisi 4x4 (yang menghasilkan 16 sel). Kepadatan kisi didefinisikan berdasarkan per tingkat.
Pernyataan CREATE SPATIAL INDEXTransact-SQL mendukung klausul GRIDS yang memungkinkan Anda menentukan kepadatan kisi yang berbeda pada tingkat yang berbeda. Kepadatan kisi untuk tingkat tertentu ditentukan dengan menggunakan salah satu kata kunci berikut.
Kata kunci | Konfigurasi kisi | Jumlah sel |
---|---|---|
Rendah | 4X4 | 16 |
Sedang | 8X8 | 64 |
TINGGI | 16X16 | 256 |
Di SQL Server, ketika tingkat kompatibilitas database diatur ke 100 atau lebih rendah, maka defaultnya adalah MEDIUM di semua tingkatan. Ketika tingkat kompatibilitas database diatur ke 110 atau lebih tinggi, maka defaultnya adalah skema kisi otomatis. (Kisi otomatis menunjukkan konfigurasi tingkat 8 HLLLLL.) Alih-alih memvariasikan kepadatan kisi indeks, Anda dapat memvariasikan sel per objek dan mengkueri sel jendela per objek melalui petunjuk.
Anda dapat mengontrol proses dekomposisi dengan menentukan kepadatan kisi non-default. Misalnya, kepadatan kisi yang berbeda pada tingkat yang berbeda mungkin berguna untuk menyempurnakan indeks berdasarkan ukuran ruang terindeks dan objek di kolom spasial.
Catatan
Kepadatan kisi indeks spasial terlihat di kolom level_1_grid, level_2_grid, level_3_grid, dan level_4_grid tampilan katalog sys.spatial_index_tessellations saat tingkat kompatibilitas database diatur ke 100 atau lebih rendah. Opsi skema GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tessellation tidak mengisi kolom ini. sys.spatial_index_tessellations tampilan katalog memiliki nilai NULL untuk kolom ini saat opsi kisi otomatis digunakan.
Tessellation
Setelah dekomposisi ruang terindeks ke dalam hierarki kisi, indeks spasial membaca data dari kolom spasial, baris demi baris. Setelah membaca data untuk objek spasial (atau instans), indeks spasial melakukan proses tessellation untuk objek tersebut. Proses tesselulasi cocok dengan objek ke dalam hierarki kisi dengan mengaitkan objek dengan sekumpulan sel kisi yang disentuhnya (sel yang disentuh). Mulai dari tingkat 1 hierarki kisi, proses tessellation berlangsung luas terlebih dahulu di seluruh tingkat. Berpotensi, proses dapat berlanjut melalui keempat tingkat, satu tingkat pada satu waktu.
Output dari proses tessellation adalah sekumpulan sel yang disentuh yang direkam dalam indeks spasial untuk objek. Dengan merujuk pada sel-sel yang direkam ini, indeks spasial dapat menemukan objek di ruang relatif terhadap objek lain di kolom spasial yang juga disimpan dalam indeks.
Aturan Tessellation
Untuk membatasi jumlah sel yang disentuh yang direkam untuk objek, proses tessellation menerapkan beberapa aturan tessellation. Aturan ini menentukan kedalaman proses tesselulasi dan sel yang disentuh mana yang direkam dalam indeks.
Aturan ini adalah sebagai berikut:
Aturan penutup
Jika objek benar-benar menutupi sel, sel tersebut dikatakan ditutupi oleh objek. Sel tercakup dihitung dan tidak di-tessellated. Aturan ini berlaku di semua tingkat hierarki kisi. Aturan yang mencakup menyederhanakan proses tessellation dan mengurangi jumlah data yang direkam indeks spasial.
Aturan sel per objek
Aturan ini memberlakukan batas sel per objek, yang menentukan jumlah maksimum sel yang dapat dihitung untuk setiap objek, kecuali pada tingkat 1. Pada tingkat yang lebih rendah, aturan sel per objek mengontrol jumlah informasi yang dapat direkam tentang objek.
Aturan sel terdalam
Aturan sel terdalam menghasilkan perkiraan terbaik dari objek dengan hanya merekam sel terbanyak bawah yang telah diselidiki untuk objek tersebut. Sel induk tidak berkontribusi pada jumlah sel per objek, dan tidak direkam dalam indeks.
Aturan tesselulasi ini diterapkan secara rekursif pada setiap tingkat kisi. Bagian lainnya menjelaskan aturan tessellation secara lebih rinci.
Aturan Penutup
Jika objek benar-benar menutupi sel, sel tersebut dikatakan ditutupi oleh objek. Misalnya, dalam ilustrasi berikut, salah satu sel tingkat kedua, 15,11, sepenuhnya dicakup oleh bagian tengah oktagon.
Sel tercakup dihitung dan direkam dalam indeks, dan sel tidak di-tessellated lebih lanjut.
Aturan Sel Per Objek
Tingkat tessellasi setiap objek terutama tergantung pada batas sel-per-objek indeks spasial. Batas ini menentukan jumlah maksimum sel yang dapat dihitung tessellation per objek. Namun, perhatikan bahwa aturan sel per objek tidak diberlakukan untuk tingkat 1, sehingga dimungkinkan untuk melebihi batas ini. Jika jumlah tingkat-1 mencapai, atau melebihi, batas sel per objek, tidak ada tesselulasi lebih lanjut yang terjadi di tingkat yang lebih rendah.
Selama jumlahnya kurang dari batas sel per objek, proses tessellation berlanjut. Dimulai dengan sel dengan sentuhan angka terendah (misalnya, sel 15,6 dalam ilustrasi sebelumnya), proses menguji setiap sel untuk mengevaluasi apakah akan menghitungnya atau tessellate. Jika memisahkan sel akan melebihi batas sel per objek, sel dihitung dan tidak di-tessellated. Jika tidak, sel dipenggal, dan sel tingkat bawah yang disentuh oleh objek dihitung. Proses tessellation berlanjut dengan cara ini, luas-bijaksana, di seluruh tingkat. Proses ini diulang secara rekursif untuk kisi tingkat bawah sel yang di-tesseling hingga batas tercapai atau tidak ada lagi sel untuk dihitung.
Misalnya, pertimbangkan ilustrasi sebelumnya, yang menunjukkan oktagon yang pas sepenuhnya ke sel 15 kisi tingkat-1. Dalam gambar, sel 15 telah di-tessellated, membedah oktagon menjadi sembilan sel tingkat-2. Ilustrasi ini mengasumsikan bahwa batas sel per objek adalah 9 atau lebih. Namun, jika batas sel per objek adalah 8 atau kurang, sel 15 tidak akan di-tessellated, dan hanya sel 15 yang akan dihitung untuk objek tersebut.
Secara default, batas sel per objek adalah 16 sel per objek, yang memberikan trade-off yang memuaskan antara ruang dan presisi untuk sebagian besar indeks spasial. Namun, pernyataan CREATE SPATIAL INDEXTransact-SQL mendukung klausa CELLS_PER_OBJECT = n yang memungkinkan Anda menentukan batas sel per objek antara 1 dan 8192, inklusif.
Catatan
Pengaturan cells_per_object indeks spasial terlihat dalam tampilan katalog sys.spatial_index_tessellations .
Aturan Sel Terdalam
Aturan sel terdalam mengeksploitasi fakta bahwa setiap sel tingkat bawah milik sel di atasnya: sel tingkat-4 milik sel tingkat 3, sel tingkat-3 milik sel tingkat-2, dan sel tingkat-2 milik sel tingkat-1. Misalnya, objek milik sel 1.1.1.1 juga milik sel 1.1.1, sel 1.1, dan sel 1. Pengetahuan tentang hubungan hierarki sel tersebut dibangun ke dalam prosesor kueri. Oleh karena itu, hanya sel tingkat terdalam yang perlu dicatat dalam indeks, meminimalkan informasi yang perlu disimpan indeks.
Dalam ilustrasi berikut, poligon berbentuk berlian yang relatif kecil dipesan. Indeks menggunakan batas sel-per-objek default 16, yang tidak tercapai untuk objek kecil ini. Oleh karena itu, tessellation terus turun ke tingkat 4. Poligon berada di sel level-1 hingga level-3 berikut: 4, 4.4, dan 4.4.10 dan 4.4.14. Namun, menggunakan aturan sel terdalam, tessel hanya menghitung dua belas sel tingkat-4: 4.4.10.13-15 dan 4.4.14.1-3, 4.4.14.5-7, dan 4.4.14.9-11.
Skema Tessellation
Perilaku indeks spasial sebagian bergantung pada skema tesselulasinya. Skema tessellation khusus untuk jenis data. Di SQL Server, indeks spasial mendukung dua skema tessellation:
Tesselulasi kisi geometri, yang merupakan skema untuk jenis data geometri .
Tessellasi kisi geografi, yang berlaku untuk kolom jenis data geografi .
Catatan
Pengaturan tessellation_scheme indeks spasial terlihat dalam tampilan katalog sys.spatial_index_tessellations.
Skema Geometry Grid Tessellation
GEOMETRY_AUTO_GRID tessellation adalah skema tessellation default untuk jenis data geometri untuk SQL Server 2012 (11.x) dan yang lebih baru. GEOMETRY_GRID tessellation adalah satu-satunya skema tessellation yang tersedia untuk jenis data geometri di SQL Server 2008 (10.0.x). Bagian ini membahas aspek tesselulasi kisi geometri yang relevan dengan bekerja dengan indeks spasial: metode dan kotak pembatas yang didukung.
Catatan
Anda dapat secara eksplisit menentukan skema tesselulasi ini dengan menggunakan klausa USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) dari pernyataan CREATE SPATIAL INDEX Transact-SQL.
Kotak Pembatas
Data geometrik menempati bidang yang bisa tak terbatas. Namun, di SQL Server, indeks spasial membutuhkan ruang terbatas. Untuk menetapkan ruang terbatas untuk dekomposisi, skema tesselulasi kisi geometri memerlukan kotak pembatas persegi panjang. Kotak pembatas didefinisikan oleh empat koordinat, (x-min,y-min) dan (x-max,y-max), yang disimpan sebagai properti indeks spasial. Koordinat ini mewakili hal-hal berikut:
x-min adalah koordinat x dari sudut kiri bawah kotak pembatas.
y-min adalah koordinat y dari sudut kiri bawah.
x-max adalah koordinat x dari sudut kanan atas.
y-max adalah koordinat y dari sudut kanan atas.
Catatan
Koordinat ini ditentukan oleh klausul BOUNDING_BOX pernyataan CREATE SPATIAL INDEXTransact-SQL.
Koordinat (x-min,y-min) dan (x-max,y-max) menentukan penempatan dan dimensi kotak pembatas. Ruang di luar kotak pembatas diperlakukan sebagai sel tunggal yang bernomor 0.
Indeks spasial menguraikan ruang di dalam kotak pembatas. Kisi tingkat 1 hierarki kisi mengisi kotak pembatas. Untuk menempatkan objek geometrik dalam hierarki kisi, indeks spasial membandingkan koordinat objek dengan koordinat kotak pembatas.
Ilustrasi berikut menunjukkan titik yang ditentukan oleh koordinat (x-min,y-min) dan (x-max,y-max) dari kotak pembatas. Tingkat atas hierarki kisi ditampilkan sebagai kisi 4x4. Untuk tujuan ilustrasi, tingkat yang lebih rendah dihilangkan. Ruang di luar kotak pembatas ditunjukkan oleh nol (0). Perhatikan bahwa objek 'A' meluas sebagian di luar kotak, dan objek 'B' terletak sepenuhnya di luar kotak dalam sel 0.
Kotak pembatas sesuai dengan beberapa bagian data spasial aplikasi. Apakah kotak pembatas indeks sepenuhnya berisi data yang disimpan di kolom spasial, atau hanya berisi sebagian, terserah aplikasi. Hanya operasi yang dihitung pada objek yang sepenuhnya berada di dalam kotak pembatas yang mendapat manfaat dari indeks spasial. Oleh karena itu, untuk mendapatkan keuntungan terbesar dari indeks spasial pada kolom geometri , Anda perlu menentukan kotak pembatas yang berisi semua atau sebagian besar objek.
Catatan
Kepadatan kisi indeks spasial terlihat di kolom bounding_box_xmin, bounding_box_ymin, bounding_box_xmax, dan bounding_box_ymax tampilan katalog sys.spatial_index_tessellations .
Skema Tessellation Kisi Geografi
Skema tessellation ini hanya berlaku untuk kolom geografi . Bagian ini meringkas metode yang didukung oleh tesselulasi kisi geografi dan membahas bagaimana ruang geodetik diproyeksikan ke bidang, yang kemudian diurai menjadi hierarki kisi.
Catatan
Anda dapat secara eksplisit menentukan skema tesselulasi ini dengan menggunakan klausa USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) dari pernyataan CREATE SPATIAL INDEXTransact-SQL.
Proyeksi Ruang Geodetik ke Pesawat
Komputasi pada instans geografi (objek) memperlakukan ruang yang berisi objek sebagai elipsoid geodetik. Untuk menguraikan ruang ini, skema tesselulasi kisi geografi membagi permukaan elipsoid menjadi belahan atas dan bawahnya dan kemudian melakukan langkah-langkah berikut:
Memproyeksikan setiap belahan ke aspek piramida quadrilateral.
Meratakan dua piramida.
Menggabungkan piramida yang diratakan untuk membentuk pesawat non-Euclidean.
Ilustrasi berikut menunjukkan tampilan skema dari proses dekomposisi tiga langkah. Dalam piramida, garis putus-putus mewakili batas empat faset dari setiap piramida. Langkah 1 dan 2 mengilustrasikan elipsoid geodetik, menggunakan garis horizontal hijau untuk mewakili garis lintang khatulistiwa dan serangkaian garis vertikal hijau untuk mewakili beberapa garis bujur. Langkah 1 menunjukkan piramida yang diproyeksikan di atas dua belahan bumi. Langkah 2 menunjukkan piramida yang diratakan. Langkah 3 menggambarkan piramida yang diratakan, setelah digabungkan untuk membentuk bidang, menunjukkan sejumlah garis bujur yang diproyeksikan. Perhatikan bahwa garis yang diproyeksikan ini diluruskan dan bervariasi panjangnya, tergantung di mana garis tersebut jatuh pada piramida.
Setelah ruang diproyeksikan ke bidang, bidang diurai menjadi hierarki kisi empat tingkat. Tingkat yang berbeda dapat menggunakan kepadatan kisi yang berbeda. Ilustrasi berikut menunjukkan bidang setelah diurai menjadi kisi 4x4 level-1. Untuk tujuan ilustrasi, tingkat hierarki kisi yang lebih rendah dihilangkan. Dalam aktualitas, bidang sepenuhnya terurai menjadi hierarki kisi empat tingkat. Setelah proses dekomposisi selesai, data geografis dibaca, baris demi baris, dari kolom geografi, dan proses tessellation dilakukan untuk setiap objek secara bergantian.
Metode yang Didukung oleh Indeks Spasial
Metode Geometri Yang Didukung oleh Indeks Spasial
Indeks spasial mendukung metode geometri berorientasi set berikut dalam kondisi tertentu: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches(), dan STWithin(). Untuk didukung oleh indeks spasial, metode ini harus digunakan dalam klausa WHERE atau JOIN ON kueri, dan harus terjadi dalam predikat formulir umum berikut:
geometri1.method_name(geometri2)comparison_operator**valid_number
Untuk mengembalikan hasil non-null, geometri1 dan geometri2 harus memiliki pengidentifikasi referensi spasial (SRID) yang sama. Jika tidak, metode mengembalikan NULL.
Indeks spasial mendukung formulir predikat berikut:
geometri1.STContains(geometry2) = 1
geometri1.Nomor STDistance(geometri2) <
geometri1.STDistance(geometri2) <= angka
geometri1.STEquals(geometri2)= 1
geometri1.STIntersects(geometry2)= 1
geometri1. STOverlaps (geometri2) = 1
geometri1.STTouches(geometri2) = 1
geometri1.STWithin(geometri2)= 1
Metode Geografi Didukung oleh Indeks Spasial
Dalam kondisi tertentu, indeks spasial mendukung metode geografi berorientasi set berikut: STIntersects(), STEquals(), dan STDistance(). Untuk didukung oleh indeks spasial, metode ini harus digunakan dalam klausul WHERE kueri, dan harus terjadi dalam predikat formulir umum berikut:
geografi1.method_name(geography2)comparison_operator**valid_number
Untuk mengembalikan hasil non-null, geography1 dan geography2 harus memiliki Pengidentifikasi Referensi Spasial (SRID) yang sama. Jika tidak, metode mengembalikan NULL.
Indeks spasial mendukung formulir predikat berikut:
geografi1.STIntersects(geography2)= 1
geografi1.STEquals(geography2)= 1
geografi1.Nomor STDistance(geography2) <
geografi1.STDistance(geography2) <= angka
Kueri yang menggunakan Indeks Spasial
Indeks spasial hanya didukung dalam kueri yang menyertakan operator spasial terindeks dalam klausa WHERE . Misalnya sintaks seperti:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Pengoptimal kueri memahami komutativitas operasi spasial (yang @a.STIntersects(@b) = @b.STInterestcs(@a)
). Namun, indeks spasial tidak akan digunakan jika awal perbandingan tidak berisi operator spasial (misalnya WHERE 1 = spatial op
tidak akan menggunakan indeks spasial). Untuk menggunakan indeks spasial, tulis ulang perbandingan (misalnya WHERE spatial op = 1
).
Seperti halnya indeks lain, ketika indeks spasial didukung, penggunaan indeks spasial dipilih berdasarkan biaya, sehingga pengoptimal kueri mungkin tidak memilih untuk menggunakan indeks spasial meskipun semua persyaratan untuk menggunakannya terpenuhi. Gunakan showplan untuk melihat apakah indeks spasial digunakan dan jika perlu, berikan petunjuk kueri untuk memaksa rencana kueri yang diinginkan.
Jenis kueri tetangga terdekat juga mendukung indeks spasial namun hanya jika sintaks kueri tertentu ditulis. Sintaksis yang sesuai adalah:
SELECT TOP(K) [WITH TIES] *
FROM <Table> AS T [WITH(INDEX(<SpatialIndex>))]
WHERE <SpatialColumn>.STDistance(@reference_object) IS NOT NULL
ORDER BY <SpatialColumn>.STDistance(@reference_object) [;]