Microsoft belgelerine göre, uzamsal dizinler, bir cümle ile karşılaştırma yükleminin başlangıcında göründüklerinde aşağıdaki yöntemlerde coğrafya türleriyle kullanılacaktır WHERE
:
STIntersects
STDistance
STEquals
Yalnızca geometri türlerinin yöntemleri (kısıtlı liste), uzamsal dizin kullanımını tetikleyecektir JOIN ... ON
, bu nedenle kullanılacak kodunuzu değiştirin WHERE geog1.STIntersects(geog2) = 1
ve bu da hızı artırmalıdır.
Ayrıca g2server'ın cevabında tavsiye almanızı ve filtreleme için aşağıdakileri eklemenizi ve üzerine uzamsal dizin eklemenizi öneririm
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
Daha sonra aşağıdaki gibi bir sorgu olabilir (i hızla bu yazı yazdı ve henüz test değil, bu sadece denemek için bir şey çünkü ben sorgunuzu ve en yüksek gönderilen cevaplar kullanmak kullanmaz spatial op = 1 JOIN ON gördüm uzamsal dizin):
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: Eğer SimplePolysGeog
üst üste binme (yukarıda bir pimde olduğu gibi iki basitleştirilmiş coğrafyada olduğu gibi), yukarıdaki durum işe yaramaz, bunu sadece bir eyaletteki bölgelerdeki insanlar üzerinde çalıştırdı ve normal polisler sınır paylaştığından, sınırlayıcı kutular üst üste geldi, bu yüzden çoğu kullanımda durumlarda, alt sorgunun birden fazla sonuç döndürdüğü hatası verir.
MS Docs'un Mekansal Dizinlerine Genel Bakış :
Mekansal Endekslerle Desteklenen Coğrafya Yöntemleri
Belirli koşullar altında, uzamsal dizinler aşağıdaki küme odaklı coğrafya yöntemlerini destekler: STIntersects (), STEquals () ve STDistance (). Bir uzamsal dizin tarafından desteklenmek için, bu yöntemler bir sorgunun WHERE yan tümcesinde kullanılmalı ve aşağıdaki genel formun bir yüklemesi içinde gerçekleşmelidir:
geography1.method_name (geography2) comparison_operatorvalid_number
Boş olmayan bir sonuç döndürmek için, coğrafya1 ve coğrafya2 aynı Uzamsal Referans Tanımlayıcısına (SRID) sahip olmalıdır . Aksi takdirde, yöntem NULL döndürür.
Uzamsal dizinler aşağıdaki yüklem formlarını destekler:
Uzamsal Dizinler kullanan sorgular
Uzamsal dizinler yalnızca WHERE yan tümcesinde bir dizinlenmiş uzamsal işleç içeren sorgularda desteklenir. Örneğin, aşağıdaki gibi sözdizimi:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Sorgu iyileştirici, uzamsal işlemlerin değişebilirliğini (o @a.STIntersects(@b) = @b.STInterestcs(@a)
) anlar . Ancak, karşılaştırmanın başlangıcı uzamsal işleç içermiyorsa WHERE 1 = spatial op
uzamsal dizin kullanılmayacaktır (örneğin uzamsal dizin kullanılmayacaktır). Uzamsal dizini kullanmak için karşılaştırmayı yeniden yazın (örneğin WHERE spatial op = 1
).
...
SimplePolysGeogs
Çakışma durumunda aşağıdaki sorgu çalışır :
;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