Consultar dados espaciais de vizinho mais próximo
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
Em SQL Server, TOP
as cláusulas e ORDER BY
são usadas para executar uma consulta vizinho mais próxima 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áusulasWHERE
eORDER BY
.A cláusula
TOP
não pode conter uma instruçãoPERCENT
.A cláusula
WHERE
deve conter um métodoSTDistance()
.Se houver vários predicados na cláusula
WHERE
, o predicado que contém o métodoSTDistance()
deve ser conectado por uma conjunçãoAND
aos outros predicados. O métodoSTDistance()
não pode estar em uma parte opcional da cláusulaWHERE
.A primeira expressão na cláusula
ORDER BY
deve usar o métodoSTDistance()
.A ordem de classificação para a primeira expressão
STDistance()
na cláusulaORDER BY
deve serASC
.Todas as linhas para as quais
STDistance
retornaNULL
devem ser filtradas.
Aviso
Os métodos que levam geography
ou tipos de dados geometry
como argumentos retornarão NULL
se o SRIDs não forem o mesmo para os 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 mosaicos de índice espacial, consulte Dados espaciais (SQL Server).
Exemplo
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 AdventureWorks2012
.
USE AdventureWorks2012
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
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 AdventureWorks2012
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.