De acordo com os documentos da Microsoft, os índices espaciais serão usados com os tipos de região geográfica nos métodos a seguir quando aparecerem no início de um predicado de comparação com uma WHERE
cláusula:
STIntersects
STDistance
STEquals
Somente os métodos dos tipos de geometria (lista restrita) acionarão o uso do índice espacial JOIN ... ON
, portanto, mude seu código para usar WHERE geog1.STIntersects(geog2) = 1
e isso deve melhorar a velocidade.
Também recomendo seguir o conselho da resposta do g2server e adicionar o seguinte para filtrar e adicionar índice espacial nele
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
você poderia então ter uma consulta como a seguinte (escrevi esta postagem rapidamente e ainda não a testei, isso é apenas algo para tentar, porque eu vi que sua consulta e as respostas mais altas postadas usam JOIN ON spatial op = 1, que não usará um índice espacial):
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
Para sua informação: O exemplo acima não funciona se SimplePolysGeog
acabar sobreposto (como em um alfinete pode estar em dois geogs simplificados, apenas o executei em pessoas em distritos de um estado e, como os polys normais compartilham o limite, as caixas delimitadoras se sobrepõem), portanto, na maior parte do uso casos, lançará um erro que a subconsulta retornou mais de um resultado.
Da visão geral dos índices espaciais do MS Docs :
Métodos de geografia suportados por índices espaciais
Sob certas condições, os índices espaciais suportam os seguintes métodos de geografia orientada a conjunto: STIntersects (), STEquals () e STDistance (). Para serem suportados por um índice espacial, esses métodos devem ser usados na cláusula WHERE de uma consulta e devem ocorrer dentro de um predicado da seguinte forma geral:
geography1.method_name (geography2) Comparation_operatorvalid_number
Para retornar um resultado não nulo, geography1 e geography2 devem ter o mesmo SRID (Spatial Reference Identifier) . Caso contrário, o método retornará NULL.
Os índices espaciais suportam as seguintes formas de predicado:
Consultas que usam índices espaciais
Os índices espaciais são suportados apenas em consultas que incluem um operador espacial indexado na cláusula WHERE. Por exemplo, sintaxe como:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
O otimizador de consulta entende a comutatividade das operações espaciais (isso @a.STIntersects(@b) = @b.STInterestcs(@a)
). No entanto, o índice espacial não será usado se o início de uma comparação não contiver o operador espacial (por exemplo WHERE 1 = spatial op
, não usará o índice espacial). Para usar o índice espacial, reescreva a comparação (por exemplo WHERE spatial op = 1
).
...
A consulta a seguir funcionará se SimplePolysGeogs
sobrepor:
;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