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 Preview
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.
In de volgende afbeelding ziet u de uitgevouwen cel rechtsboven op elk niveau van de rasterhiërarchie in een 4x4-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.
Grid Density
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 | Grid configuration | 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 standaardwaarde een schema voor automatisch raster. (Automatisch raster geeft een configuratie van 8 niveaus van HLLLLLLL aan.) In plaats van de verschillende indexrasterdichtheid kunt u cellen per object en queryvenstercellen per object variëren via hint.
U kunt het ontledingsproces beheren door niet-standaardrasterdichtheid 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 rasterdichtheid van een ruimtelijke index is zichtbaar in de kolommen level_1_grid, level_2_grid, level_3_grid en level_4_grid kolommen 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 NULL-waarden voor deze kolommen bevat wanneer de opties voor automatisch raster 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 eerst breed 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 Rules
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 regel voor dekking
Als het object een cel volledig bedekt, wordt die cel geacht te worden gedekt door het object. Een gedekte cel wordt geteld en wordt niet tessellated. 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. Bovenliggende cellen dragen niet bij aan het aantal cellen per object en worden niet vastgelegd 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.
Covering Rule
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 geteld.
Cells-Per-Object Rule
De omvang van de tesselatie van elk object is voornamelijk afhankelijk van de cel-per-objectlimiet van de ruimtelijke index. Deze limiet definieert het maximum aantal cellen dat per object 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 aantal niveau 1 bereikt of overschrijdt, bereikt of overschrijdt, de limiet voor cellen per object, vindt er geen verdere tesselatie plaats op de 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), test het proces elke cel om te evalueren of deze moet worden geteld of tessellate. Als het delen van een cel de limiet voor cellen per object overschrijdt, wordt de cel geteld en niet tesellated. Anders wordt de cel tessellated en worden de cellen op een lager niveau geteld die door het object worden aangeraakt. Het tessellationproces gaat op deze manier door, breed, over het niveau. Dit proces wordt recursief herhaald voor de rasters op lager niveau van de tesellated cellen totdat de limiet is bereikt of dat 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 tesellated, waarbij de octagon in negen cellen op niveau 2 wordt ontleden. In deze afbeelding wordt ervan uitgegaan dat de limiet voor cellen per object 9 of meer is. Als de limiet voor cellen per object echter 8 of minder is, wordt cel 15 niet tesellated en alleen die cel 15 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.
Deepest-Cell Rule
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 veelhoek tessellated. 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.
Tessellation Schemes
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:
Geometrieraster tesselatie, 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 is de x-coördinaat van de linkerbenedenhoek van het begrenzingsvak.
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 ontleden de ruimte in het begrenzingsvak. 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 ziet u de punten die zijn gedefinieerd door de coördinaten (x-min,y-min) en (x-max,y-max) van het begrenzingsvak. Het hoogste niveau van de rasterhiërarchie wordt weergegeven als een 4x4-raster. Ter illustratie worden de lagere niveaus weggelaten. De ruimte buiten het begrenzingsvak wordt aangegeven met een nul (0). Houd er rekening mee dat object 'A' zich gedeeltelijk buiten het vak bevindt en object 'B' zich volledig buiten het vak in cel 0 bevindt.
Een begrenzingsvak komt overeen met een deel van de ruimtelijke gegevens van een toepassing. Of het begrenzingsvak van de index de gegevens bevat die zijn opgeslagen in de ruimtelijke kolom of alleen een gedeelte bevat, is 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 het grootste voordeel te krijgen 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 geografische instanties (objecten) behandelen de ruimte die de objecten bevat als een geodetisch beletselteken. Als u deze ruimte wilt opsplitsen, verdeelt het geografieraster het oppervlak van het beletselteken in de bovenste en onderste halfronden en voert vervolgens de volgende stappen uit:
Projecten elk halfrond op de facetten van een quadrilaterale piramide.
Plat 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 het geodetische beletselteken met behulp van een groene horizontale lijn om de evenaar-breedtegraadlijn en een reeks groene verticale lijnen weer te geven die meerdere lengtegraadlijnen vertegenwoordigen. 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 rasterdichtheid 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 uitgevouwen proces is voltooid, worden de geografische gegevens gelezen, rij per rij, uit de kolom geografie en wordt het tessellationproces voor elk object op zijn beurt 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:
geometry1.method_name(geometry2)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
geometry1.STEquals(geometry2)= 1
geometry1.STIntersects(geometry2)= 1
geometrie1.STOverlaps(geometrie2) = 1
geometrie1. STTouches(geometrie2) = 1
geometry1.STWithin(geometry2)= 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:
geography1.method_name(geography2)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
geography1.STEquals(geography2)= 1
geografie1. STDistance(geografie2) <getal
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) [;]