Query dei dati spaziali per Nearest Neighbor
La query Nearest Neighbor è una query comune utilizzata con dati spaziali. Le query Nearest Neighbor vengono utilizzate per trovare gli oggetti spaziali più vicini a un oggetto spaziale specifico. Un localizzatore di archivio per un sito Web, ad esempio, deve spesso trovare i percorsi di archivio più vicini alla posizione di un cliente.
Una query Nearest Neighbor può essere scritta in una varietà di formati di query validi, ma per l'utilizzo di un indice spaziale è necessario utilizzare la sintassi seguente.
Sintassi
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 ]
[ ; ]
Query Nearest Neighbor e indici spaziali
In SQL Server TOP
e ORDER BY
le clausole vengono usate per eseguire una query Nearest Neighbor sulle colonne di dati spaziali. La clausola ORDER BY
contiene una chiamata al metodo STDistance()
per il tipo di dati della colonna spaziale. La clausola TOP
indica il numero di oggetti da restituire per la query.
Per utilizzare un indice spaziale in una query Nearest Neighbor, è necessario soddisfare i requisiti seguenti:
In una delle colonne spaziali deve essere presente un indice spaziale e tale colonna deve essere utilizzata dal metodo
STDistance()
nelle clausoleWHERE
eORDER BY
.La clausola
TOP
non può contenere un'istruzionePERCENT
.La clausola
WHERE
deve contenere un metodoSTDistance()
.Se nella clausola
WHERE
sono presenti più predicati, il predicato che contiene il metodoSTDistance()
deve essere connesso mediante una congiunzioneAND
ad altri predicati. Il metodoSTDistance()
non può trovarsi in una parte facoltativa della clausolaWHERE
.La prima espressione nella clausola
ORDER BY
deve utilizzare il metodoSTDistance()
.L'ordinamento per la prima espressione
STDistance()
nella clausolaORDER BY
deve essereASC
.Devono essere filtrate tutte le righe per le quali
STDistance
restituisceNULL
.
Avviso
I metodi che accettano tipi di dati geography
o geometry
come argomenti restituiranno NULL
se gli identificatori SRID non sono gli stessi per i tipi.
Per gli indici utilizzati nelle query Nearest Neighbor è consigliabile utilizzare i nuovi schemi a mosaico di indice spaziale. Per altre informazioni sulle tassellature dell'indice spaziale, vedere Dati spaziali (SQL Server).For more information on spatial index tessellations, see Spatial Data (SQL Server).
Esempio
Nell'esempio di codice seguente viene illustrata una query Nearest Neighbor nella quale può essere utilizzato un indice spaziale. Nell'esempio viene utilizzata la tabella Person.Address
del database 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);
Creare un indice spaziale nella colonna SpatialLocation per vedere in che modo viene utilizzato un indice spaziale in una query Nearest Neighbor. Per ulteriori informazioni sulla creazione di indici spaziali, vedere Create, Modify, and Drop Spatial Indexes.
Esempio
Nell'esempio di codice seguente viene illustrata una query Nearest Neighbor nella quale non può essere utilizzato un indice spaziale.
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);
Nella query manca una clausola WHERE
che utilizza STDistance()
in un formato specificato nella sezione relativa alla sintassi, pertanto nella query non può essere utilizzato un indice spaziale.