Kueri Data Spasial untuk Tetangga Terdekat
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Kueri umum yang digunakan dengan data spasial adalah kueri Tetangga Terdekat. Kueri Tetangga terdekat digunakan untuk menemukan objek spasial terdekat dengan objek spasial tertentu. Misalnya, penemu toko untuk situs Web sering kali harus menemukan lokasi toko terdekat dengan lokasi pelanggan.
Kueri Tetangga Terdekat dapat ditulis dalam berbagai format kueri yang valid, tetapi agar kueri Tetangga Terdekat menggunakan indeks spasial, sintaks berikut harus digunakan.
Sintaks
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
Kueri Tetangga terdekat dan Indeks Spasial
Di klausa SQL Server, TOP dan ORDER BY digunakan untuk melakukan kueri Tetangga Terdekat pada kolom data spasial. Klausa ORDER BY berisi panggilan ke STDistance()
metode untuk jenis data kolom spasial. Klausa TOP menunjukkan jumlah objek yang akan dikembalikan untuk kueri.
Persyaratan berikut harus dipenuhi untuk kueri Tetangga Terdekat untuk menggunakan indeks spasial:
Indeks spasial harus ada di salah satu kolom spasial dan
STDistance()
metode harus menggunakan kolom tersebut dalam klausa WHERE dan ORDER BY .Klausa TOP tidak boleh berisi pernyataan PERCENT .
Klausa WHERE harus berisi
STDistance()
metode .Jika ada beberapa predikat dalam klausul WHERE , maka predikat yang berisi
STDistance()
metode harus dihubungkan oleh konjunsi AND dengan predikat lain. MetodeSTDistance()
tidak dapat berada di bagian opsional dari klausul WHERE .Ekspresi pertama dalam klausa ORDER BY harus menggunakan
STDistance()
metode .Urutan pengurutan untuk ekspresi pertama
STDistance()
dalam klausa ORDER BY harus ASC.Semua baris yang
STDistance
mengembalikan NULL harus difilter.
Peringatan
Metode yang mengambil jenis data geografi atau geometri sebagai argumen akan mengembalikan NULL jika SRID tidak sama untuk jenisnya.
Disarankan agar tesselulasi indeks spasial baru digunakan untuk indeks yang digunakan dalam kueri Tetangga Terdekat. Untuk informasi selengkapnya tentang tesselulasi indeks spasial, lihat Data Spasial (SQL Server).
Contoh 1
Contoh kode berikut menunjukkan kueri Tetangga Terdekat yang bisa menggunakan indeks spasial. Contoh menggunakan Person.Address
tabel dalam AdventureWorks2022
database sampel.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
Buat indeks spasial pada kolom SpatialLocation untuk melihat bagaimana kueri Tetangga Terdekat menggunakan indeks spasial. Untuk informasi selengkapnya tentang membuat indeks spasial, lihat Membuat, Memodifikasi, dan Menghilangkan Indeks Spasial.
Contoh 2
Contoh kode berikut menunjukkan kueri Tetangga Terdekat yang tidak dapat menggunakan indeks spasial.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
Kueri tidak memiliki klausa WHERE yang digunakan dalam formulir yang ditentukan di bagian sintaks sehingga kueri tidak dapat menggunakan indeks spasial STDistance()
.