Laut Microsoft-Dokumenten werden räumliche Indizes mit Geografietypen für die folgenden Methoden verwendet, wenn sie am Anfang eines Vergleichsprädikats mit einer WHERE
Klausel angezeigt werden:
STIntersects
STDistance
STEquals
Nur die Methoden der Geometrietypen (eingeschränkte Liste) lösen die Verwendung des räumlichen Index in aus JOIN ... ON
. Ändern Sie daher den zu verwendenden CodeWHERE geog1.STIntersects(geog2) = 1
die Geschwindigkeit zu verbessern.
Ich empfehle außerdem, sich in der Antwort von g2server beraten zu lassen und Folgendes zum Filtern hinzuzufügen und einen räumlichen Index hinzuzufügen
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
Sie könnten dann eine Abfrage wie die folgende haben (ich habe diesen Beitrag schnell geschrieben und noch nicht getestet. Dies ist nur ein Versuch, da ich gesehen habe, dass Ihre Abfrage und die am höchsten geposteten Antworten JOIN ON räumlich op = 1 verwenden, wobei a nicht verwendet wird räumlicher Index):
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
Zu Ihrer Information: Das oben genannte funktioniert nicht, wenn SimplePolysGeog
Ihrer Information Genannte Ende überlappt (wie in einem Pin in zwei vereinfachten Geogs, kann dies nur für Personen in Bezirken in einem Bundesstaat ausgeführt werden und da sich normale Polys die Grenzen teilen, überlappen sich die Begrenzungsrahmen), so dass sie in den meisten Fällen verwendet werden In diesen Fällen wird der Fehler ausgegeben, dass die Unterabfrage mehr als ein Ergebnis zurückgegeben hat.
Aus der Übersicht über die räumlichen Indizes von MS Docs :
Geografische Methoden, die von räumlichen Indizes unterstützt werden
Unter bestimmten Bedingungen unterstützen räumliche Indizes die folgenden satzorientierten Geografiemethoden: STIntersects (), STEquals () und STDistance (). Um von einem räumlichen Index unterstützt zu werden, müssen diese Methoden in der WHERE-Klausel einer Abfrage verwendet werden und in einem Prädikat der folgenden allgemeinen Form vorkommen:
geography1.method_name (geography2) compare_operatorvalid_number
Um ein Ergebnis ungleich Null zurückzugeben, müssen Geografie1 und Geografie2 dieselbe räumliche Referenzkennung (Spatial Reference Identifier, SRID) haben . Andernfalls gibt die Methode NULL zurück.
Raumindizes unterstützen die folgenden Prädikatformen:
Abfragen, die räumliche Indizes verwenden
Raumindizes werden nur in Abfragen unterstützt, die einen indizierten Raumoperator in der WHERE-Klausel enthalten. Zum Beispiel Syntax wie:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Der Abfrageoptimierer versteht die Kommutativität räumlicher Operationen (das @a.STIntersects(@b) = @b.STInterestcs(@a)
). Der räumliche Index wird jedoch nicht verwendet, wenn der Beginn eines Vergleichs den räumlichen Operator nicht enthält (z. B. WHERE 1 = spatial op
wird der räumliche Index nicht verwendet). Um den räumlichen Index zu verwenden, schreiben Sie den Vergleich neu (zum Beispiel WHERE spatial op = 1
).
...
Die folgende Abfrage funktioniert bei SimplePolysGeogs
Überlappung:
;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