Microsoft 문서에 따르면 공간 인덱스는 WHERE
절 과 함께 비교 술어의 시작 부분에 나타날 때 다음 방법에서 지리 유형과 함께 사용됩니다 .
STIntersects
STDistance
STEquals
지오메트리 유형의 메서드 (제한된 목록) 만의 공간 인덱스 사용을 트리거 JOIN ... ON
하므로 사용하도록 코드를 변경 WHERE geog1.STIntersects(geog2) = 1
하면 속도가 향상됩니다.
또한 g2server의 답변에 조언을 하고 필터링하고 공간 인덱스를 추가하기 위해 다음을 추가하는 것이 좋습니다.
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
그런 다음 다음과 같은 쿼리를 가질 수 있습니다 (이 게시물을 빨리 작성했지만 아직 테스트하지 않았습니다. 이는 귀하의 쿼리와 가장 높은 답변이 JOIN ON 공간 op = 1을 사용하므로 공간 인덱스) :
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
참고 : 위의 결과는 SimplePolysGeog
겹치는 경우 작동하지 않습니다 (핀에서 두 개의 단순화 된 Geog에있을 수 있음). 하위 쿼리가 둘 이상의 결과를 반환 한 경우 오류가 발생합니다.
MS Docs의 공간 인덱스 개요에서 :
공간 인덱스가 지원하는 지리 방법
특정 조건에서 공간 인덱스는 STIntersects (), STquals () 및 STDistance ()와 같은 집합 지향 지리 메서드를 지원합니다. 공간 인덱스에서 지원하려면 이러한 메소드는 쿼리의 WHERE 절 내에서 사용해야하며 다음과 같은 일반적인 형식의 술어 내에서 발생해야합니다.
geography1.method_name (geography2) 비교 _ 연산자 valid_number
널이 아닌 결과를 리턴하려면 geography1 및 geography2 에 동일한 SRID (Spatial Reference Identifier) 가 있어야합니다 . 그렇지 않으면, 메소드는 NULL을 리턴합니다.
공간 인덱스는 다음 술어 양식을 지원합니다.
공간 인덱스를 사용하는 쿼리
공간 인덱스는 WHERE 절에 인덱스 공간 연산자가 포함 된 쿼리에서만 지원됩니다. 예를 들어 다음과 같은 구문 :
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
쿼리 옵티마이 저는 공간 연산의 공통성을 이해합니다 @a.STIntersects(@b) = @b.STInterestcs(@a)
. 그러나 비교 시작에 공간 연산자가 포함되어 있지 않으면 공간 인덱스가 사용되지 않습니다 (예 : WHERE 1 = spatial op
공간 인덱스를 사용하지 않음). 공간 인덱스를 사용하려면 비교를 다시 작성하십시오 (예 :) WHERE spatial op = 1
.
...
SimplePolysGeogs
겹치는 경우 다음 쿼리가 작동합니다 .
;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