Consultar dados espaciais de vizinho mais próximo
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Uma consulta comum usada com dados espaciais é a consulta de Vizinho Mais Próximo. As consultas de Vizinho Mais Próximo são usadas para localizar os objetos espaciais mais próximos a um objeto espacial específico. Por exemplo, um localizador de lojas para um site geralmente deve localizar os locais de loja mais próximos ao local de um cliente.
Uma consulta de Vizinho Mais Próximo pode ser escrita em uma variedade de formatos de consulta válidos, mas, para que a consulta de Vizinho Mais Próximo use um índice espacial, a sintaxe a seguir deve ser usada.
Sintaxe
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
Consulta de Vizinho Mais Próximo e índices espaciais
No SQL Server, as cláusulas TOP e ORDER BY são usadas para realizar uma consulta Vizinho mais próximo em colunas de dados espaciais. A cláusula ORDER BY contém uma chamada ao método STDistance()
para o tipo de dados de coluna espacial. A cláusula TOP indica o número de objetos a ser retornado para a consulta.
Os requisitos a seguir devem ser satisfeitos para uma consulta de Vizinho Mais Próximo para usar um índice espacial:
Um índice espacial deve estar presente em uma das colunas espaciais e o método
STDistance()
deve usar essa coluna nas cláusulas WHERE e ORDER BY .A cláusula TOP não pode conter uma instrução PERCENT .
A cláusula WHERE deve conter um método
STDistance()
.Se houver vários predicados na cláusula WHERE , o predicado que contém o método
STDistance()
deverá ser conectado por uma conjunção AND aos outros predicados. O métodoSTDistance()
não pode estar em uma parte opcional da cláusula WHERE .A primeira expressão na cláusula ORDER BY deve usar o método
STDistance()
.A ordem de classificação para a primeira expressão
STDistance()
na cláusula ORDER BY deve ser ASC.Todas as linhas para as quais
STDistance
retorna NULL devem ser filtradas.
Aviso
Os métodos que usam geography ou tipos de dados geometry como argumentos retornarão NULL se as SRIDs não forem as mesmas dos tipos.
É recomendado que os novos mosaicos de índice espaciais sejam usados para índices usados em consultas de Vizinhos Mais Próximos. Para obter mais informações sobre tesselações de índices espaciais, consulte Dados espaciais (SQL Server).
Exemplo 1
O exemplo de código a seguir mostra para uma consulta de Vizinho Mais Próximo que pode usar um índice espacial. O exemplo usa a tabela Person.Address
no banco de dados de amostra AdventureWorks2022
.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
Crie um índice espacial na coluna SpatialLocation para ver como uma consulta de Vizinho Mais Próximo usa um índice espacial. Para obter mais informações sobre como criar índices espaciais, consulte Create, Modify, and Drop Spatial Indexes.
Exemplo 2
O exemplo de código a seguir mostra para uma consulta de Vizinho Mais Próximo que não pode usar um índice espacial.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
A consulta não tem uma cláusula WHERE que usa STDistance()
em uma forma especificada na seção de sintaxe; portanto, a consulta não pode usar um índice espacial.