Eseguire query sui dati spaziali per il vicino più vicino
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Endpoint di analisi SQL in Microsoft Fabric
Magazzino in Microsoft Fabric
Database SQL in Microsoft Fabric
Una interrogazione comune usata con i dati spaziali è l'interrogazione del vicino più prossimo. Le query adiacenti più vicine vengono usate per trovare gli oggetti spaziali più vicini a un oggetto spaziale specifico. Ad esempio, un localizzatore di punti vendita per un sito Web spesso deve trovare le posizioni più vicine dei negozi a una posizione del cliente.
Una query di vicino più prossimo può essere scritta in vari formati di query validi, ma per utilizzare un indice spaziale nella query di vicino più prossimo, è necessario usare 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 del vicino più prossimo e indici spaziali
In SQL Server, le clausole TOP
e ORDER BY
vengono utilizzate per eseguire una query dei vicini più prossimi 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 una query del più vicino vicinato usare un indice spaziale, devono essere soddisfatti i seguenti requisiti:
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 SRID non sono uguali per i tipi.
È consigliabile usare i nuovi tassellamenti di indice spaziale per gli indici usati nelle query adiacenti più vicine. Per altre informazioni sulle tassellature dell'indice spaziale, vedere Dati spaziali.
Esempio 1
Nell'esempio di codice seguente viene mostrata una query del vicino più prossimo che può usare un indice spaziale. L’esempio usa la tabella Person.Address
del database di esempio 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);
Creare un indice spaziale nella colonna SpatialLocation per comprendere come una query per il vicino più vicino utilizza un indice spaziale. Per ulteriori informazioni sulla creazione di indici spaziali, vedere Create, Modify, and Drop Spatial Indexes.
Esempio 2
Nell'esempio di codice seguente viene illustrata una query del vicino più prossimo che non può usare un indice spaziale.
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);
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.