Gambaran Umum Indeks Spasial

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase 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 berikutnya menguraikan lebih lanjut tingkat di atasnya, sehingga setiap sel pada tingkat yang lebih tinggi 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 dekomposisi sel di kanan atas pada setiap tingkat hierarki kisi menjadi kisi 4x4. Pada kenyataannya, semua sel diurai dengan cara ini. Jadi, misalnya, membagi suatu ruang menjadi empat tingkat kisi 4x4 sebenarnya akan menghasilkan total 65.536 sel tingkat keempat.

Empat tingkat tesselulasi rekursif

Note

Penguraian ruang untuk indeks spasial tidak bergantung pada satuan pengukuran yang digunakan data aplikasi.

Sel dalam hierarki grid dinomori secara linier dengan menggunakan variasi dari kurva pengisian ruang Hilbert. Namun, untuk tujuan ilustrasi, pembahasan ini menggunakan penomoran sederhana per baris, alih-alih penomoran yang sebenarnya dihasilkan oleh kurva Hilbert. Dalam ilustrasi berikut, beberapa poligon yang mewakili bangunan dan garis yang mewakili jalan telah ditempatkan dalam kisi 4x4 level 1. Sel tingkat 1 dinomor dari 1 hingga 16, dimulai dengan sel kiri atas.

Poligon dan garis ditempatkan dalam grid 4x4 level-1

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.

Keyword Konfigurasi jaringan Jumlah sel
LOW 4X4 16
MEDIUM 8X8 64
HIGH 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. (Grid otomatis menunjukkan konfigurasi 8 level, yaitu HLLLLLLL.) Alih-alih mengubah kepadatan grid indeks, Anda dapat mengubah jumlah sel per objek dan jumlah sel jendela kueri per objek melalui hint.

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.

Note

Kepadatan grid indeks spasial terlihat dalam kolom level_1_grid, level_2_grid, level_3_grid, dan level_4_grid dari tampilan katalog sys.spatial_index_tessellations saat tingkat kompatibilitas basis data diatur ke 100 atau lebih rendah. Opsi skema teselasi GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tidak mengisi kolom-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 teselasi untuk objek tersebut. Proses teselasi menempatkan objek ke dalam hierarki kisi dengan mengaitkan objek tersebut dengan sekumpulan sel kisi yang disentuhnya (sel yang disentuh). Mulai dari level 1 dalam hierarki grid, proses teselasi berjalan secara melebar terlebih dahulu pada level tersebut. Berpotensi, proses dapat berlanjut melalui keempat tingkat, satu tingkat pada satu waktu.

Hasil dari proses teselasi adalah sekumpulan sel-sel yang tersentuh yang dicatat dalam indeks spasial untuk objek tersebut. 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 Penyusunan Tessellation

Untuk membatasi jumlah sel yang terdampak yang dicatat untuk suatu objek, proses tesselasi menerapkan beberapa aturan tesselasi. 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 yang tercakup tetap dihitung dan tidak diteselasi. Aturan ini berlaku di semua tingkat hierarki kisi. Aturan cakupan menyederhanakan proses teselasi dan mengurangi jumlah data yang dicatat oleh indeks spasial.

  • Aturan jumlah 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 aproksimasi terbaik untuk suatu objek dengan hanya merekam sel paling bawah yang telah diteselasi 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 Cakupan

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 tercakup dihitung dan dicatat dalam indeks, dan sel tersebut tidak diteselasi lebih lanjut.

Sel-Aturan Per Objek

Tingkat teselasi setiap objek terutama ditentukan oleh batas sel per objek pada indeks spasial. Batas ini menentukan jumlah maksimum sel yang dapat dihitung oleh teselasi per objek. Namun, perhatikan bahwa aturan sel per objek tidak diberlakukan untuk tingkat 1, sehingga dimungkinkan untuk melebihi batas ini. Jika jumlah pada level 1 mencapai atau melebihi batas jumlah sel per objek, tesselasi lebih lanjut tidak dilakukan pada level yang lebih rendah.

Selama jumlahnya kurang dari batas sel per objek, proses tessellation berlanjut. Dimulai dari sel tersentuh dengan nomor terendah (misalnya, sel 15.6 pada ilustrasi sebelumnya), proses ini menguji setiap sel untuk menentukan apakah sel tersebut akan dihitung atau di-teselasi. Jika penteselasian sebuah sel akan melampaui batas jumlah sel per objek, sel tersebut dihitung dan tidak diteselasi. Jika tidak, sel dipenggal, dan sel tingkat bawah yang disentuh oleh objek dihitung. Proses teselasi berlanjut dengan cara ini, melebar di seluruh level. Proses ini diulang secara rekursif untuk kisi tingkat lebih rendah dari sel yang ditesselasi hingga batasnya tercapai atau tidak ada lagi sel yang dapat dihitung.

Misalnya, perhatikan ilustrasi sebelumnya, yang menunjukkan segi delapan yang termuat sepenuhnya dalam sel 15 kisi level-1. Dalam gambar, sel 15 telah diteselasi, membagi oktagon menjadi sembilan sel level-2. Ilustrasi ini mengasumsikan bahwa batas sel per objek adalah 9 atau lebih. Namun, jika batas jumlah sel per objek adalah 8 atau kurang, sel 15 tidak akan diteselasi, dan hanya sel 15 itulah 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, CREATE SPATIAL INDEX pernyataanTransact-SQL mendukung klausa CELLS_PER_OBJECT =n yang memungkinkan Anda menentukan batas sel per objek antara 1 dan 8192, inklusif.

Note

Pengaturan cells_per_object pada indeks spasial dapat dilihat di 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, sebuah poligon kecil berbentuk wajik disusun membentuk teselasi. 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, dengan menggunakan aturan sel terdalam, tesselasi hanya menghitung dua belas sel level-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 Tesselasi

Perilaku indeks spasial sebagian bergantung pada skema tesselulasinya. Skema teselasi spesifik untuk jenis data. Di SQL Server, indeks spasial mendukung dua skema tessellation:

  • Teselasi kisi geometri, yaitu skema untuk jenis data geometri.

  • Tesselasi grid geografi, yang berlaku untuk kolom dengan tipe data geography.

Note

Pengaturan tessellation_scheme dari indeks spasial ditampilkan dalam tampilan katalog sys.spatial_index_tessellations.

Skema Teselasi Kisi Geometri

GEOMETRY_AUTO_GRID tessellation adalah skema tessellation default untuk tipe data geometry pada SQL Server 2012 (11.x) dan versi 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 teselasi grid geometri yang relevan untuk penggunaan indeks spasial: metode yang didukung dan kotak pembatas.

Note

Anda dapat secara eksplisit menentukan skema tessellation ini dengan menggunakan klausa USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) dari CREATE SPATIAL INDEX pernyataan Transact-SQL.

Kotak Pembatas

Data geometrik menempati bidang yang bisa tak terbatas. Namun, di SQL Server, indeks spasial membutuhkan ruang terbatas. Untuk membentuk ruang terbatas untuk dekomposisi, skema teselasi grid geometri memerlukan persegi panjang bounding box. 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.

Note

Koordinat ini ditentukan oleh klausa BOUNDING_BOX dari CREATE SPATIAL INDEX pernyataanTransact-SQL.

Koordinat (x-min,y-min) dan (x-max,y-max) menentukan posisi dan dimensi kotak pembatas. Ruang di luar kotak pembatas diperlakukan sebagai sel tunggal yang bernomor 0.

Indeks spasial membagi ruang di dalam kotak pembatas. Kisi level 1 dalam hierarki kisi mengisi seluruh 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) pada kotak pembatas. Tingkat teratas pada hierarki grid ditampilkan sebagai grid 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 menampilkan koordinat dan sel 0.

Kotak pembatas merepresentasikan sebagian data spasial suatu aplikasi. Apakah kotak pembatas indeks sepenuhnya berisi data yang disimpan di kolom spasial, atau hanya berisi sebagian, terserah aplikasi. Hanya operasi yang dilakukan pada objek yang sepenuhnya berada di dalam kotak pembatas yang memanfaatkan 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.

Note

Kepadatan kisi dari indeks spasial dapat dilihat pada kolom bounding_box_xmin, bounding_box_ymin, bounding_box_xmax, dan bounding_box_ymax dari tampilan katalog sys.spatial_index_tessellations.

Skema Teselasi 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.

Note

Anda dapat secara eksplisit menentukan skema tessellation ini dengan menggunakan klausa USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) dalam pernyataan CREATE SPATIAL INDEX Transact-SQL.

Proyeksi Ruang Geodetik ke Pesawat

Komputasi pada instans geografi (objek) memperlakukan ruang yang berisi objek sebagai elipsoid geodetik. Untuk membagi ruang ini, skema teselasi grid geografi membagi permukaan elipsoid menjadi hemisfer atas dan bawah, lalu melakukan langkah-langkah berikut:

  1. Memproyeksikan masing-masing belahan bumi ke sisi-sisi piramida segiempat.

  2. Meratakan dua piramida.

  3. Menggabungkan piramida yang telah diratakan untuk membentuk bidang non-Euklides.

Ilustrasi berikut menunjukkan tampilan skema dari proses dekomposisi tiga langkah. Pada piramida, garis putus-putus menunjukkan batas keempat sisi 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 menunjukkan piramida yang telah diratakan, setelah disatukan hingga membentuk sebuah bidang, dengan 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 bidang

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 tersebut diuraikan sepenuhnya 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.

Kisi geografi tingkat 1

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(). Agar didukung oleh indeks spasial, metode ini harus digunakan dalam klausa WHERE atau JOIN ON dalam kueri, dan harus muncul dalam predikat dengan bentuk umum berikut:

geometry1.method_name(geometry2)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 Didukung oleh Indeks Spasial

Dalam kondisi tertentu, indeks spasial mendukung metode geografi berorientasi set berikut: STIntersects(), STEquals(), dan STDistance(). Agar didukung oleh indeks spasial, metode-metode ini harus digunakan dalam klausa WHERE dalam kueri, dan harus terdapat di dalam predikat dengan bentuk umum berikut:

geography1.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.STIntersects(@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) [;]  

Lihat Juga

Data Spasial (SQL Server)