Gambaran Umum Indeks Spasial

Berlaku untuk: SQL Server (semua versi yang didukung) Azure SQL Database Azure SQL Managed Instance

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

SQL Server alat spasial 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

Dalam 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 mengimplementasikan penguraian ruang seragam hierarkis. Proses pembuatan indeks menguraikan ruang 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 pada 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 penguraian 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 level-empat.

Empat tingkat tesselulasi rekursif

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 spasi Hilbert. Namun, untuk tujuan ilustrasi, diskusi ini menggunakan penomoran baris sederhana, alih-alih penomoran yang sebenarnya dihasilkan oleh kurva Hilbert. Dalam ilustrasi berikut, beberapa poligon yang mewakili bangunan, dan garis yang mewakili jalanan, telah ditempatkan ke dalam kisi 4x4, level-1. Sel level-1 dinomor dari 1 hingga 16, dimulai dengan sel kiri atas.

Poligon dan garis ditempatkan ke dalam Poligon kisi 4x4 level-1

Kepadatan Kisi

Jumlah sel di sepanjang sumbu kisi menentukan kepadatannya: semakin besar angka, semakin padat kisi. 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

Dalam SQL Server, ketika tingkat kompatibilitas database diatur ke 100 atau lebih rendah, defaultnya adalah MEDIUM pada semua tingkatan. Saat tingkat kompatibilitas database diatur ke 110 atau lebih tinggi, maka defaultnya adalah skema kisi otomatis. (Kisi otomatis menunjukkan konfigurasi 8 tingkat HLLLLLLL.) Alih-alih memvariasikan kepadatan kisi indeks, Anda dapat memvariasikan sel per objek dan mengkueri sel jendela per objek melalui petunjuk.

Anda dapat mengontrol proses penguraian 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 GEOGRAPHY_AUTO_GRIDtessellationGEOMETRY_AUTO_GRID/ tidak mengisi kolom ini. sys.spatial_index_tessellations tampilan katalog memiliki nilai NULL untuk kolom ini saat opsi kisi otomatis digunakan.

Tessellation

Setelah penguraian 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 tessellation 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 dilanjutkan melalui keempat tingkat, satu tingkat pada satu waktu.

Output dari proses tessellation adalah sekumpulan sel tersentuh yang direkam dalam indeks spasial untuk objek. Dengan merujuk ke sel yang direkam ini, indeks spasial dapat menemukan objek dalam ruang relatif terhadap objek lain di kolom spasial yang juga disimpan dalam indeks.

Aturan Tessellation

Untuk membatasi jumlah sel tersentuh yang direkam untuk objek, proses tessellation menerapkan beberapa aturan tessellation. Aturan ini menentukan kedalaman proses tesselulasi dan sel mana yang disentuh yang direkam dalam indeks.

Aturan ini adalah sebagai berikut:

  • Aturan penutup

    Jika objek benar-benar menutupi sel, sel itu dikatakan ditutupi oleh objek . Sel tertutup dihitung dan tidak di-tesselasikan. Aturan ini berlaku di semua tingkat hierarki kisi. Aturan penutup 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 objek terbaik dengan hanya merekam sel terbanyak yang telah di-tessellasi untuk objek. 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 tesselulasi 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.

Mencakup pengoptimalan

Sel yang dicakup dihitung dan direkam dalam indeks, dan sel tidak dibagikan 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 tessellation 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 tessellating sel akan melebihi batas sel per objek, sel dihitung dan tidak di-tessellated. Jika tidak, sel tessellated, 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 tessel sampai batas tercapai atau tidak ada lagi sel untuk dihitung.

Misalnya, pertimbangkan ilustrasi sebelumnya, yang menunjukkan oktagon yang sepenuhnya pas dengan sel 15 kisi tingkat-1. Dalam gambar, sel 15 telah ditesselasikan, 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-tessel, 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 Deepest-Cell

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 direkam dalam indeks, meminimalkan informasi yang perlu disimpan indeks.

Dalam ilustrasi berikut, poligon berbentuk berlian yang relatif kecil tessellated. 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 tingkat-1 berikut hingga sel level-3: 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.

Pengoptimalan sel terdalam

Skema Tessellation

Perilaku indeks spasial sebagian bergantung pada skema tessellation-nya. Skema tessellation khusus untuk jenis data. Dalam SQL Server, indeks spasial mendukung dua skema tessellation:

  • Tesselulasi kisi geometri, yang merupakan skema untuk jenis data geometri .

  • Tesselulasi kisi geografi, yang berlaku untuk kolom jenis data geografi .

Catatan

Pengaturan tessellation_scheme indeks spasial terlihat dalam tampilan katalog sys.spatial_index_tessellations .

Skema Tessellation Kisi Geometri

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. Bagian ini membahas aspek tesselulasi kisi geometri yang relevan untuk 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 geometris menempati bidang yang bisa tak terbatas. Namun, dalam SQL Server, indeks spasial membutuhkan ruang terbatas. Untuk membangun ruang terbatas untuk penguraian, 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 klausa BOUNDING_BOX dari 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 mengurai 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 batas ditunjukkan oleh nol (0). Perhatikan bahwa objek 'A' meluas sebagian di luar kotak, dan objek 'B' berada sepenuhnya di luar kotak di sel 0.

Kotak batas memperlihatkan koordinat dan sel 0.

Kotak pembatas sesuai dengan beberapa bagian data spasial aplikasi. Apakah kotak batas 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 merangkum 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 bumi atas dan bawahnya dan kemudian melakukan langkah-langkah berikut:

  1. Memproyeksikan setiap belahan bumi ke aspek piramida quadrilateral.

  2. Meratakan dua piramida.

  3. Menggabungkan piramida yang diratakan untuk membentuk bidang non-Euclidean.

Ilustrasi berikut menunjukkan tampilan skema dari proses penguraian tiga langkah. Dalam piramida, garis putus-putus mewakili batas empat faset dari setiap piramida. Langkah 1 dan 2 menggambarkan 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.

Proyeksi elipsoid ke pesawat

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. Pada kenyataannya, bidang sepenuhnya diurai menjadi hierarki kisi empat tingkat. Setelah proses penguraian selesai, data geografis dibaca, baris demi baris, dari kolom geografi, dan proses tessellation dilakukan untuk setiap objek secara bergantian.

Kisi geografi Tingkat-1 Kisi

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 bentuk 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:

Metode Geografi Yang 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 klausa 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:

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 memberikan 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) [;]  

Lihat juga

Data Spasial (SQL Server)