Interroger des données spatiales pour un voisin le plus proche
S’applique à : point de terminaison d’analytique SQL Azure SQL Database Azure SQL Database Azure SQL Dans Microsoft Fabric Warehouse dans Microsoft Fabric SQL Database dans Microsoft Fabric SQL Database
Une requête courante utilisée avec les données spatiales est la requête voisine la plus proche. Les requêtes voisines les plus proches sont utilisées pour rechercher les objets spatiaux les plus proches d’un objet spatial spécifique. Par exemple, un localisateur de magasin pour un site web doit souvent trouver les emplacements de magasin les plus proches d’un emplacement client.
Une requête voisine la plus proche peut être écrite dans différents formats de requête valides, mais pour que la requête voisine la plus proche utilise un index spatial, la syntaxe suivante doit être utilisée.
Syntaxe
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 ]
[ ; ]
Requêtes et index spatiaux voisins les plus proches
Dans SQL Server, TOP
et ORDER BY
les clauses sont utilisées pour effectuer une requête voisine la plus proche sur les colonnes de données spatiales. La clause ORDER BY
contient un appel à la méthode STDistance()
pour le type de données de colonne spatial. La clause TOP
indique le nombre d'objets à retourner pour la requête.
Les conditions suivantes doivent être remplies pour qu’une requête voisine la plus proche utilise un index spatial :
Un index spatial doit être présent sur l'une des colonnes spatiales et la méthode
STDistance()
doit utiliser cette colonne dans les clausesWHERE
etORDER BY
.La clause
TOP
ne peut pas contenir d'instructionPERCENT
.La clause
WHERE
doit contenir une méthodeSTDistance()
.S'il existe plusieurs prédicats dans la clause
WHERE
, le prédicat qui contient la méthodeSTDistance()
doit être connecté par une conjonctionAND
aux autres prédicats. La méthodeSTDistance()
ne doit pas se trouver dans une partie facultative de la clauseWHERE
.La première expression dans la clause
ORDER BY
doit utiliser la méthodeSTDistance()
.L'ordre de tri de la première expression
STDistance()
dans la clauseORDER BY
doit êtreASC
.Toutes les lignes pour lesquelles
STDistance
retourneNULL
doivent être éliminées par filtrage.
Avertissement
Les méthodes qui prennent des types de données geography ou geometry en tant qu’arguments retournent NULL
si les SRID ne sont pas identiques pour les types.
Il est recommandé d’utiliser les nouvelles pavages d’index spatiaux pour les index utilisés dans les requêtes voisines les plus proches. Pour plus d’informations sur les pavages d’index spatiaux, consultez Données spatiales.
Exemple 1
L’exemple de code suivant montre une requête voisine la plus proche qui peut utiliser un index spatial. L’exemple utilise la table Person.Address
dans l'exemple de base de données 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);
Créez un index spatial sur la colonne SpatialLocation pour voir comment une requête voisine la plus proche utilise un index spatial. Pour plus d'informations sur la création d'index spatiaux, consultez Create, Modify, and Drop Spatial Indexes.
Exemple 2
L’exemple de code suivant montre une requête voisine la plus proche qui ne peut pas utiliser un index spatial.
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);
La requête n'a pas de clause WHERE
qui utilise STDistance()
au format spécifié dans la section Syntaxe ; la requête ne peut donc pas utiliser d'index spatial.