Menurut Microsoft docs, indeks spasial akan digunakan dengan tipe geografi pada metode berikut ketika mereka muncul di awal perbandingan predikat dengan WHERE
klausa:
STIntersects
STDistance
STEquals
Hanya metode tipe geometri (daftar terbatas) yang akan memicu penggunaan indeks spasial JOIN ... ON
, jadi ubah kode Anda untuk digunakan WHERE geog1.STIntersects(geog2) = 1
dan itu akan meningkatkan kecepatan.
Saya juga merekomendasikan untuk mengambil saran dalam jawaban g2server dan menambahkan yang berikut untuk memfilter dan menambahkan indeks spasial di atasnya
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
Anda kemudian dapat memiliki pertanyaan seperti berikut (saya menulis posting ini dengan cepat dan belum diuji, ini hanya sesuatu untuk dicoba karena saya melihat bahwa pertanyaan Anda dan jawaban yang diposting tertinggi menggunakan JOIN ON spatial op = 1 yang tidak akan menggunakan indeks spasial):
SELECT
(SELECT p2.polygon_id
FROM T_Polygon p2
WHERE p2.coords.STIntersects(t.coords) = 1),
t.pin_id
FROM T_PIN t
WHERE
(SELECT t.coords.STIntersects(p.coords)
FROM T_POLYGON p
WHERE t.coords.STIntersects(p.SimplePolysGeog) = 1) = 1
FYI: Hal di atas tidak berfungsi jika SimplePolysGeog
berakhir tumpang tindih (seperti dalam pin bisa dalam dua geog yang disederhanakan, jalankan saja ini pada orang-orang di daerah sekitar dalam keadaan dan karena batas normal polys berbagi, kotak terikat tumpang tindih), jadi dalam kebanyakan penggunaan kasus, itu akan menimbulkan kesalahan bahwa subquery mengembalikan lebih dari satu hasil.
Dari Ikhtisar Indeks Spasial MS Documents :
Metode Geografi Didukung oleh Indeks Spasial
Dalam kondisi tertentu, indeks spasial mendukung metode geografi set-berorientasi berikut: STIntersects (), STEquals (), dan STDistance (). Untuk didukung oleh indeks spasial, metode ini harus digunakan dalam klausa WHERE kueri, dan mereka harus terjadi dalam predikat bentuk umum berikut:
geography1.method_name (geography2) comparison_operatorvalid_number
Untuk mengembalikan hasil yang tidak nol, geografi1 dan geografi2 harus memiliki Pengidentifikasi Referensi Spasial (SRID) yang sama . Jika tidak, metode mengembalikan NULL.
Indeks spasial mendukung bentuk predikat berikut:
Kueri yang menggunakan Indeks Spasial
Indeks spasial hanya didukung dalam kueri yang menyertakan operator spasial yang diindeks dalam klausa WHERE. Misalnya sintaksis seperti:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Pengoptimal kueri memahami komutatif operasi spasial (itu @a.STIntersects(@b) = @b.STInterestcs(@a)
). Namun, indeks spasial tidak akan digunakan jika awal perbandingan tidak mengandung operator spasial (misalnya WHERE 1 = spatial op
tidak akan menggunakan indeks spasial). Untuk menggunakan indeks spasial, tulis ulang perbandingannya (misalnya WHERE spatial op = 1
).
...
Kueri berikut akan berfungsi jika SimplePolysGeogs
tumpang tindih:
;WITH cte AS
(
SELECT T_PIN.PIN_ID,
T_POLYGON.POLYGON_ID,
T_POLYGON.COORD
FROM T_PIN
INNER JOIN T_POLYGON
ON T_PIN.COORD.STIntersects(T_POLYGON.SimplePolysGeog) = 1
)
SELECT COUNT(*)
FROM T_PIN
INNER JOIN cte
ON T_PIN_PIN_ID = cte.PIN_ID
where cte.[COORD].STIntersects(T_PIN.COORD) = 1