Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Endpoint SQL analytics dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base de données SQL dans Microsoft Fabric
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.
Syntax
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 clausesWHEREetORDER BY.La clause
TOPne peut pas contenir d'instructionPERCENT.La clause
WHEREdoit 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 conjonctionANDaux 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 BYdoit utiliser la méthodeSTDistance().L'ordre de tri de la première expression
STDistance()dans la clauseORDER BYdoit êtreASC.Toutes les lignes pour lesquelles
STDistanceretourneNULLdoivent être éliminées par filtrage.
Warning
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 AdventureWorks2025.
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.