Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Uma consulta comum usada com dados espaciais é a consulta vizinho mais próxima. Consultas vizinhas mais próximas são usadas para localizar os objetos espaciais mais próximos de um objeto espacial específico. Por exemplo, um localizador de lojas para um site geralmente deve encontrar as localizações de loja mais próximas da localização do cliente.
Uma consulta vizinho mais próxima pode ser escrita em uma variedade de formatos de consulta válidos, mas para que a consulta 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 vizinha mais próxima e índices espaciais
No SQL Server, as cláusulas TOP e ORDER BY são usadas para executar uma consulta de 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 dado espacial da coluna. A TOP cláusula indica o número de objetos a serem retornados para a consulta.
Os seguintes requisitos devem ser atendidos para que uma consulta de vizinho mais próximo use 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áusulasWHEREeORDER BY.A
TOPcláusula não pode conter umaPERCENTinstrução.A
WHEREcláusula deve conter umSTDistance()método.Se houver vários predicados na cláusula
WHERE, o predicado que contém o métodoSTDistance()deverá ser ligado por uma conjunçãoANDaos outros predicados. OSTDistance()método não pode estar em uma parte opcional daWHEREcláusula.A primeira expressão na
ORDER BYcláusula deve usar oSTDistance()método.A ordem de classificação para a primeira
STDistance()expressão naORDER BYcláusula deve serASC.Todas as linhas para as quais
STDistanceretornaNULLdevem ser filtradas.
Aviso
Métodos que assumem geography ou geometry tipos de dados como argumentos retornarão NULL se os SRIDs não forem os mesmos para os tipos.
É recomendável que os novos mosaicos de índices espaciais sejam usados para índices utilizados em consultas de vizinho mais próximo. Para obter mais informações sobre mosaicos de índice espacial, consulte Dados Espaciais (SQL Server).
Exemplo
O exemplo de código a seguir mostra uma consulta vizinho mais próxima que pode usar um índice espacial. O exemplo usa a Person.Address tabela no AdventureWorks2012 banco de dados.
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 vizinho mais próxima usa um índice espacial. Para obter mais informações sobre como criar índices espaciais, consulte Criar, Modificar e Remover Índices Espaciais.
Exemplo
O exemplo de código a seguir mostra uma consulta vizinho mais próxima 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, assim, a consulta não pode utilizar um índice espacial.