Delen via


Query's uitvoeren op ruimtelijke gegevens voor dichtstbijzijnde buren

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft FabricSQL-database in Microsoft Fabric

Een veelvoorkomende query die wordt gebruikt met ruimtelijke gegevens, is de dichtstbijzijnde buurquery. Query's van dichtstbijzijnde buren worden gebruikt om de dichtstbijzijnde ruimtelijke objecten te vinden voor een specifiek ruimtelijk object. Een winkelzoeker voor een website moet bijvoorbeeld vaak de dichtstbijzijnde winkellocaties vinden bij een klantlocatie.

Een nabijheidsquery kan worden geschreven in verschillende geldige queryindelingen, maar moet de volgende syntaxis gebruiken om een ruimtelijke index te benutten.

Syntaxis

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 ]  
[ ; ]  

Nabijheidsquery en ruimtelijke indices

In SQL Server worden TOP- en ORDER BY-componenten gebruikt om een dichtstbijzijnde buurquery uit te voeren op kolommen met ruimtelijke gegevens. De ORDER BY-clausule bevat een aanroep van de STDistance()-methode voor het ruimtelijk kolomgegevenstype. De component TOP geeft het aantal objecten aan dat moet worden geretourneerd voor de query.

Aan de volgende vereisten moet worden voldaan voor een dichtstbijzijnde buurquery voor het gebruik van een ruimtelijke index:

  1. Een ruimtelijke index moet aanwezig zijn op een van de ruimtelijke kolommen en de methode STDistance() moet die kolom gebruiken in de WHERE- en ORDER BY-clausules.

  2. De TOP-clausule kan geen PERCENT-verklaring bevatten.

  3. De WHERE-clausule moet een STDistance()-methode bevatten.

  4. Als er meerdere predicaten in de WHERE component staan, moet het predicaat met STDistance() methode worden verbonden door een AND samenvoeging met de andere predicaten. De methode STDistance() kan niet in een optioneel deel van de WHERE-component staan.

  5. De eerste expressie in de ORDER BY-component moet de methode STDistance() gebruiken.

  6. Sorteervolgorde voor de eerste STDistance()-uitdrukking in de ORDER BY-clausule moet ASCzijn.

  7. Alle rijen waarvoor STDistanceNULL retourneert, moeten worden uitgefilterd.

Waarschuwing

Methoden die geografie of geometrie gegevenstypen als argumenten, retourneren NULL als de SRID's niet hetzelfde zijn voor de typen.

Het wordt aanbevolen om de nieuwe ruimtelijke indextegels te gebruiken voor indexen die worden gebruikt in nabijheidsqueries. Zie ruimtelijke datavoor meer informatie over ruimtelijke indextessellaties.

Voorbeeld 1

In het volgende codevoorbeeld ziet u een dichtstbijzijnde buurquery die een ruimtelijke index kan gebruiken. In het voorbeeld wordt de Person.Address tabel in de AdventureWorks2022 voorbeelddatabase gebruikt.

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);  

Maak een ruimtelijke index in de kolom SpatialLocation om te zien hoe een dichtstbijzijnde buurquery gebruikmaakt van een ruimtelijke index. Zie Ruimtelijke indexen maken, wijzigen en verwijderenvoor meer informatie over het maken van ruimtelijke indexen.

Voorbeeld 2

In het volgende codevoorbeeld ziet u een dichtstbijzijnde buurquery die geen ruimtelijke index kan gebruiken.

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);  

De query ontbreekt een WHERE component die gebruikmaakt van STDistance() in een formulier dat is opgegeven in de syntaxissectie, zodat de query geen ruimtelijke index kan gebruiken.