Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
SQL Server ondersteunt ruimtelijke gegevens en ruimtelijke indexen. Een ruimtelijke index is een type uitgebreide index waarmee u een ruimtelijke kolom kunt indexeren. Een ruimtelijke kolom is een tabelkolom die gegevens van een ruimtelijk gegevenstype bevat, zoals geometrie of geografie.
Tip
Ruimtelijke SQL Server-hulpprogramma's is een door Microsoft gesponsorde opensource-verzameling hulpprogramma's voor gebruik met de ruimtelijke typen in SQL Server. Dit project biedt een set herbruikbare functies waarvan toepassingen gebruik kunnen maken. Deze functies kunnen routines voor gegevensconversie, nieuwe transformaties, aggregaties, enzovoort omvatten. Zie Microsoft/SQLServerSpatialTools in GitHub voor meer informatie.
Over ruimtelijke indexen
Geïndexeerde ruimte opsplitsen in een rasterhiërarchie
In SQL Server worden ruimtelijke indexen gebouwd met behulp van B-trees, wat betekent dat de indexen de tweedimensionale ruimtelijke gegevens moeten vertegenwoordigen in de lineaire volgorde van B-trees. Daarom implementeert SQL Server, voordat u gegevens in een ruimtelijke index leest, een hiërarchische uniforme ontleding van de ruimte. Met het proces voor het maken van indexen wordt de ruimte opgesplitst in een rasterhiërarchie met vier niveaus. Deze niveaus worden niveau 1 (het hoogste niveau), niveau 2, niveau 3 en niveau 4 genoemd.
Elk achtereenvolgend niveau wordt het niveau erboven verder ontleden, dus elke cel op het hoogste niveau bevat een volledig raster op het volgende niveau. Op een bepaald niveau hebben alle rasters hetzelfde aantal cellen langs beide assen (bijvoorbeeld 4x4 of 8x8) en zijn de cellen allemaal één grootte.
De volgende illustratie toont de decompositie van de cel rechtsboven op elk niveau van de rasterhiërarchie in een 4 bij 4 raster. In werkelijkheid worden alle cellen op deze manier gedecomposeerd. Het opdelen van een ruimte in vier niveaus van 4x4 rasters produceert dus in totaal 65.536 cellen op niveau vier.
Note
De uitsplitsing van de ruimte voor een ruimtelijke index is onafhankelijk van de maateenheid die door de toepassingsgegevens wordt gebruikt.
Rasterhiërarchiecellen worden op lineaire wijze genummerd met behulp van een variatie van de Hilbert-curve voor ruimtevullen. Voor illustratie gebruikt deze discussie echter een eenvoudige rijgewijze nummering, in plaats van de nummering die daadwerkelijk wordt geproduceerd door de Hilbert-curve. In de volgende afbeelding zijn verschillende veelhoeken die gebouwen vertegenwoordigen en lijnen die straten vertegenwoordigen, al in een raster van 4x4 niveau 1 geplaatst. De cellen op niveau 1 zijn genummerd van 1 tot en met 16, te beginnen met de cel linksboven.
Rasterdichtheid
Het aantal cellen langs de assen van een raster bepaalt de dichtheid: hoe groter het getal, hoe dichter het raster. Een raster van 8x8 (dat 64 cellen produceert), is bijvoorbeeld dichter dan een 4x4-raster (dat 16 cellen produceert). Rasterdichtheid wordt per niveau gedefinieerd.
De instructie CREATE SPATIAL INDEXTransact-SQL ondersteunt een GRIDS-component waarmee u verschillende rasterdichtheiden op verschillende niveaus kunt opgeven. De rasterdichtheid voor een bepaald niveau wordt opgegeven met behulp van een van de volgende trefwoorden.
| Keyword | Rasterconfiguratie | Aantal cellen |
|---|---|---|
| LOW | 4X4 | 16 |
| MEDIUM | 8X8 | 64 |
| HIGH | 16X16 | 256 |
Als in SQL Server het compatibiliteitsniveau van de database is ingesteld op 100 of lager, is de standaardwaarde GEMIDDELD op alle niveaus. Wanneer het compatibiliteitsniveau van de database is ingesteld op 110 of hoger, is de standaardinstelling een automatisch rasterpatroon. (Automatisch raster geeft een configuratie van 8 niveaus van HLLLLLLL aan.) In plaats van de verschillende indexrasterdichtheid kunt u cellen per object en zoekvenstercellen per object variëren met behulp van een hint.
U kunt het ontledingsproces beheren door niet-standaardrasterdichtheden op te geven. Verschillende rasterdichtheiden op verschillende niveaus kunnen bijvoorbeeld handig zijn om een index af te stemmen op basis van de grootte van de geïndexeerde ruimte en de objecten in de ruimtelijke kolom.
Note
De rasterdichtheden van een ruimtelijke index zijn zichtbaar in de kolommen level_1_grid, level_2_grid, level_3_grid en level_4_grid van de sys.spatial_index_tessellations catalogusweergave wanneer het compatibiliteitsniveau van de database is ingesteld op 100 of lager. De opties GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tessellationschema's vullen deze kolommen niet in. sys.spatial_index_tessellations catalogusweergave heeft NULL waarden voor deze kolommen wanneer de opties voor automatische rasterindeling worden gebruikt.
Tessellation
Na het uitvouwen van een geïndexeerde ruimte in een rasterhiërarchie, leest de ruimtelijke index de gegevens uit de ruimtelijke kolom, rij per rij. Nadat u de gegevens voor een ruimtelijk object (of exemplaar) hebt gelezen, voert de ruimtelijke index een tesselatieproces voor dat object uit. Het tessellationproces past het object in de rasterhiërarchie door het object te koppelen aan een set rastercellen die het aanraakt (aangeraakte cellen). Vanaf niveau 1 van de rasterhiërarchie gaat het tesselatieproces breedte eerst over het niveau. Mogelijk kan het proces alle vier niveaus doorlopen, één niveau tegelijk.
De uitvoer van het tesselatieproces is een reeks aangeraakte cellen die zijn vastgelegd in de ruimtelijke index voor het object. Door te verwijzen naar deze vastgelegde cellen, kan de ruimtelijke index het object in de ruimte vinden ten opzichte van andere objecten in de ruimtelijke kolom die ook in de index zijn opgeslagen.
Tessellation-regels
Om het aantal aangeraakte cellen te beperken dat voor een object wordt vastgelegd, past het tessellationproces verschillende tessellationregels toe. Deze regels bepalen de diepte van het tesselatieproces en welke van de aangeraakte cellen worden vastgelegd in de index.
Deze regels zijn als volgt:
De dekregel
Als het object een cel volledig bedekt, wordt die cel geacht te worden gedekt door het object. Een afgedekte cel wordt geteld en niet getesselleerd. Deze regel is van toepassing op alle niveaus van de rasterhiërarchie. De dekkingsregel vereenvoudigt het tesselatieproces en vermindert de hoeveelheid gegevens die een ruimtelijke indexrecord bevat.
De regel voor cellen per object
Met deze regel wordt de limiet voor cellen per object afgedwongen, waarmee het maximum aantal cellen wordt bepaald dat voor elk object kan worden geteld, met uitzondering van niveau 1. Op lagere niveaus bepaalt de regel voor cellen per object de hoeveelheid informatie die over het object kan worden vastgelegd.
De diepste celregel
De diepste celregel genereert de beste benadering van een object door alleen de onderste cellen op te nemen die voor het object zijn geteld. Moedercellen leveren geen bijdrage aan het aantal cellen per object en worden niet geregistreerd in de index.
Deze tessellationregels worden recursief toegepast op elk rasterniveau. In de rest van deze sectie worden de regels voor de tessellation gedetailleerder beschreven.
Regel voor dekking
Als een object een cel volledig bedekt, wordt die cel geacht te worden gedekt door het object. In de volgende afbeelding wordt bijvoorbeeld een van de cellen op het tweede niveau, 15,11, volledig bedekt door het middelste gedeelte van een octagon.
Een gedekte cel wordt geteld en vastgelegd in de index, en de cel wordt niet verder gepartitioneerd.
Cellen-per-Object Regel
De omvang van de tesselatie van elk object is voornamelijk afhankelijk van de cel-per-objectlimiet van de ruimtelijke index. Deze limiet bepaalt het maximale aantal cellen dat per object door tessellatie kan worden geteld. Houd er echter rekening mee dat de regel voor cellen per object niet wordt afgedwongen voor niveau 1, dus het is mogelijk om deze limiet te overschrijden. Als het niveau-1-aantal de limiet voor cellen per object bereikt of overschrijdt, vindt er geen verdere tessellatie plaats op lagere niveaus.
Zolang het aantal kleiner is dan de limiet voor cellen per object, wordt het tesselatieproces voortgezet. Beginnend met de cel met het laagste getal (bijvoorbeeld cel 15,6 in de vorige afbeelding), beoordeelt het proces elke cel om vast te stellen of deze moet worden geteld of getesselleerd. Als het gefacetteerd worden van een cel de limiet voor cellen per object overschrijdt, wordt de cel geteld en niet gefacetteerd. Anders wordt de cel getesselleerd, en worden de lagere cellen die door het object worden aangeraakt, geteld. Het tessellationproces gaat op deze wijze door, in de breedte, over de hele laag. Dit proces wordt recursief herhaald voor de rasters op lager niveau van de getesselleerde cellen totdat de limiet is bereikt of er geen cellen meer zijn om te tellen.
Denk bijvoorbeeld aan de voorgaande afbeelding, waarin een octagon wordt weergegeven die volledig in cel 15 van het raster op niveau 1 past. In de afbeelding is cel 15 getesselleerd, waarbij de achthoek wordt ontleed in negen cellen van niveau 2. In deze afbeelding wordt ervan uitgegaan dat de limiet voor cellen per object 9 of meer is. Als de limiet voor cellen per object 8 of minder is, wordt cel 15 echter niet getesselleerd, en alleen die cel 15 wordt voor het object geteld.
De limiet voor cellen per object is standaard 16 cellen per object, wat een bevredigende afweging biedt tussen de ruimte en precisie voor de meeste ruimtelijke indexen. De instructie CREATE SPATIAL INDEXTransact-SQL ondersteunt echter een CELLS_PER_OBJECT =n component waarmee u een cellimiet tussen 1 en 8192, inclusief, kunt opgeven.
Note
De cells_per_object instelling van een ruimtelijke index is zichtbaar in de sys.spatial_index_tessellations catalogusweergave.
regel voor Deepest-Cell
De diepste celregel maakt gebruik van het feit dat elke cel op een lager niveau behoort tot de cel erboven: een cel op niveau 4 behoort tot een cel op niveau 3, een cel op niveau 3 behoort tot een cel op niveau 2 en een cel op niveau 2 behoort tot een cel op niveau 1. Een object dat deel uitmaakt van cel 1.1.1.1 behoort bijvoorbeeld ook tot cel 1.1.1, cel 1.1 en cel 1. Kennis van dergelijke celhiërarchierelaties wordt ingebouwd in de queryprocessor. Daarom hoeven alleen de cellen op het hoogste niveau in de index te worden vastgelegd, waardoor de informatie die de index moet opslaan, wordt geminimaliseerd.
In de volgende afbeelding is een relatief kleine ruitvormige polygon getegeld. De index maakt gebruik van de standaardlimiet voor cellen per object van 16, die niet is bereikt voor dit kleine object. Daarom blijft de tesselatie omlaag tot niveau 4. De veelhoek bevindt zich in de volgende cellen op niveau 1 tot en met niveau 3: 4, 4.4 en 4.4.10 en 4.4.14. Met behulp van de uiterste celregel telt de tessellation echter alleen de twaalf cellen op niveau 4: 4.4.10.13-15 en 4.4.14.14.1-3, 4.4.14.5-7 en 4.4.14.9-11.
Tessellationschema's
Het gedrag van een ruimtelijke index hangt deels af van het tessellationschema. Het tessellationschema is gegevenstypespecifiek. In SQL Server ondersteunen ruimtelijke indexen twee tessellationschema's:
Tessellatie van het geometrieraster, het schema voor het gegevenstype geometrie.
Geografieraster tesselatie, die van toepassing is op kolommen van het gegevenstype Geografie .
Note
De tessellation_scheme instelling van een ruimtelijke index is zichtbaar in de sys.spatial_index_tessellations catalogusweergave.
Geometrieraster Tesselatieschema
GEOMETRY_AUTO_GRID tesselatie is het standaardschema voor de geometriegegevens voor SQL Server 2012 (11.x) en hoger. GEOMETRY_GRID tesselatie is het enige tessellationschema dat beschikbaar is voor geometriegegevenstypen in SQL Server 2008 (10.0.x). In deze sectie worden aspecten van de geometrierasterstructuur besproken die relevant zijn voor het werken met ruimtelijke indexen: ondersteunde methoden en begrenzingsvakken.
Note
U kunt dit tesselatieschema expliciet opgeven met behulp van de USING-component (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) van de instructie CREATE SPATIAL INDEX Transact-SQL.
Het begrenzingsvak
Geometrische gegevens nemen een vlak in beslag dat oneindig kan zijn. In SQL Server is voor een ruimtelijke index echter een eindige ruimte vereist. Om een eindige ruimte voor ontleding tot stand te brengen, is een rechthoekig begrenzingsvak vereist voor het geometrierasterschema. Het begrenzingsvak wordt gedefinieerd door vier coördinaten (x-min,y-min) en (x-max,y-max), die worden opgeslagen als eigenschappen van de ruimtelijke index. Deze coördinaten vertegenwoordigen het volgende:
x-min geeft de x-coördinaat van de linkerbenedenhoek van de omsluitende box.
y-min is de y-coördinaat van de linkerbenedenhoek.
x-max is de x-coördinaat van de rechterbovenhoek.
y-max is de y-coördinaat van de rechterbovenhoek.
Note
Deze coördinaten worden opgegeven door de BOUNDING_BOX component van de instructie CREATE SPATIAL INDEXTransact-SQL.
De coördinaten (x-min,y-min) en (x-max,y-max) bepalen de plaatsing en afmetingen van het begrenzingsvak. De ruimte buiten het begrenzingsvak wordt behandeld als één cel met de nummering 0.
De ruimtelijke index decomponeert de ruimte binnen het omsluitingsvak. Het raster op niveau 1 van de rasterhiërarchie vult het begrenzingsvak. Als u een geometrisch object in de rasterhiërarchie wilt plaatsen, vergelijkt de ruimtelijke index de coördinaten van het object met de coördinaten van het begrenzingsvak.
In de volgende afbeelding worden de punten getoond die zijn gedefinieerd door de coördinaten (
Een begrenzingsvak komt overeen met een gedeelte van de ruimtelijke gegevens van een toepassing. Of het omsluitende kader van de index de gegevens volledig bevat die zijn opgeslagen in de ruimtelijke kolom of slechts een gedeelte bevat, ligt aan de toepassing. Alleen bewerkingen die worden berekend op objecten die zich volledig binnen het begrenzingsvak bevinden, profiteren van de ruimtelijke index. Daarom moet u een begrenzingsvak opgeven dat alle of de meeste objecten bevat, om zo optimaal gebruik te maken van een ruimtelijke index op een geometriekolom.
Note
De rasterdichtheid van een ruimtelijke index is zichtbaar in de kolommen bounding_box_xmin, bounding_box_ymin, bounding_box_xmax en bounding_box_ymax van de sys.spatial_index_tessellations catalogusweergave.
Het geografieraster tesselatieschema
Dit tesselatieschema is alleen van toepassing op een geografiekolom . In deze sectie vindt u een overzicht van de methoden die worden ondersteund door geografische rasterlijnen en wordt besproken hoe geodetische ruimte wordt geprojecteerd op een vlak, dat vervolgens wordt uitgevouwen in een rasterhiërarchie.
Note
U kunt dit tesselatieschema expliciet opgeven met behulp van de USING-component (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) van de instructie CREATE SPATIAL INDEXTransact-SQL.
Projectie van de geodetische ruimte op een vlak
Berekeningen op geografie instanties (objecten) behandelen de ruimte die de objecten bevat als een geodetische ellipsoïde. Als u deze ruimte wilt opsplitsen, verdeelt het geografie grid tessellatie schema het oppervlak van de ellipsoïde in de bovenste en onderste halfronden en voert vervolgens de volgende stappen uit:
Projecteert elke hemisfeer op de zijden van een vierzijdige piramide.
Vlak de twee piramides.
Voegt de afgeplatte piramides samen om een niet-Euclidisch vlak te vormen.
In de volgende afbeelding ziet u een schematische weergave van het ontledingsproces in drie stappen. In de piramides vertegenwoordigen de stippellijnen de grenzen van de vier facetten van elke piramide. Stap 1 en 2 illustreren de geodetische ellipsoïde, waarbij een groene horizontale lijn de equatoriale breedtegraadlijn weergeeft en een reeks groene verticale lijnen verschillende lengtegraadlijnen vertegenwoordigt. Stap 1 toont de piramides die over de twee halfronden worden geprojecteerd. Stap 2 toont dat de piramides worden afgevlakt. Stap 3 illustreert de afgeplatte piramides, nadat ze zijn gecombineerd om een vlak te vormen, met een aantal geprojecteerde lengtegraadlijnen. U ziet dat deze geprojecteerde lijnen recht worden gelijnd en in lengte variëren, afhankelijk van waar ze op de piramides vallen.
Zodra de ruimte op het vlak is geprojecteerd, wordt het vlak uitgevouwen in de rasterhiërarchie met vier niveaus. Verschillende niveaus kunnen verschillende rasterdichtheden gebruiken. In de volgende afbeelding ziet u het vlak nadat het is uitgevouwen in een raster van 4x4 niveau 1. Ter illustratie worden de lagere niveaus van de rasterhiërarchie weggelaten. In werkelijkheid is het vlak volledig opgesplitst in een rasterhiërarchie met vier niveaus. Nadat het decompositieproces is voltooid, worden de geografische gegevens gelezen, rij voor rij, uit de kolom geografie en wordt het tessellationproces voor elk object achtereenvolgens uitgevoerd.
Methoden die worden ondersteund door ruimtelijke indexen
Geometriemethoden die worden ondersteund door ruimtelijke indexen
Ruimtelijke indexen ondersteunen de volgende setgeoriënteerde geometriemethoden onder bepaalde voorwaarden: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() en STWithin(). Als u wilt worden ondersteund door een ruimtelijke index, moeten deze methoden worden gebruikt binnen de WHERE- of JOIN ON-component van een query en moeten ze plaatsvinden binnen een predicaat van de volgende algemene vorm:
geometrie1. method_name(geometrie2)comparison_operator**valid_number
Als u een niet-null-resultaat wilt retourneren, moeten geometrie1 en geometrie2 dezelfde ruimtelijke referentie-id (SRID) hebben. Anders retourneert de methode NULL.
Ruimtelijke indexen ondersteunen de volgende predicaatvormen:
geometrie1. STContains(geometrie2) = 1
geometrie1.STDistance(geometrie2) <getal
geometrie1. STDistance(geometrie2) <= getal
geometrie1. STEquals(geometrie2)= 1
geometrie1. STIntersects(geometrie2)= 1
geometrie1.STOverlaps(geometrie2) = 1
geometrie1. STTouches(geometrie2) = 1
geometrie1. STWithin(geometrie2)= 1
Geografiemethoden die worden ondersteund door ruimtelijke indexen
Onder bepaalde omstandigheden ondersteunen ruimtelijke indexen de volgende setgeoriënteerde geografiemethoden: STIntersects(),STEquals() en STDistance(). Als u wilt worden ondersteund door een ruimtelijke index, moeten deze methoden worden gebruikt binnen de WHERE-component van een query en moeten ze plaatsvinden binnen een predicaat van de volgende algemene vorm:
geografie1. method_name(geografie2)comparison_operator**valid_number
Als u een niet-null-resultaat wilt retourneren, moeten geografie1 en geografie2 dezelfde Spatial Reference Identifier (SRID) hebben. Anders retourneert de methode NULL.
Ruimtelijke indexen ondersteunen de volgende predicaatvormen:
geography1. STIntersects(geography2)= 1
geografie1. STEquals(geografie2)= 1
geografie1.STDistance(geografie2) <waarde
geografie1. STDistance(geografie2) <= getal
Query's die gebruikmaken van ruimtelijke indexen
Ruimtelijke indexen worden alleen ondersteund in query's met een geïndexeerde ruimtelijke operator in de WHERE-component . Bijvoorbeeld syntaxis zoals:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
De query optimizer begrijpt de commutativiteit van ruimtelijke bewerkingen (dat @a.STIntersects(@b) = @b.STIntersects(@a) ). De ruimtelijke index wordt echter niet gebruikt als het begin van een vergelijking niet de ruimtelijke operator bevat (bijvoorbeeld WHERE 1 = spatial op geen gebruik maakt van de ruimtelijke index). Als u de ruimtelijke index wilt gebruiken, herschrijft u de vergelijking (bijvoorbeeld WHERE spatial op = 1).
Net als bij andere indexen wordt het gebruik van de ruimtelijke index gekozen op basis van kosten, dus de queryoptimalisatie kan er niet voor kiezen om de ruimtelijke index te gebruiken, zelfs als aan alle vereisten voor het gebruik ervan wordt voldaan. Gebruik showplan om te zien of de ruimtelijke index is gebruikt en geef indien nodig queryhints op om een gewenst queryplan af te dwingen.
Het dichtstbijzijnde type query ondersteunt ook ruimtelijke indexen, maar alleen als een specifieke querysyntaxis is geschreven. De juiste syntaxis is:
SELECT TOP(K) [WITH TIES] *
FROM <Table> AS T [WITH(INDEX(<SpatialIndex>))]
WHERE <SpatialColumn>.STDistance(@reference_object) IS NOT NULL
ORDER BY <SpatialColumn>.STDistance(@reference_object) [;]