Megosztás a következőn keresztül:


Térbeli indexek áttekintése

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Az SQL Server támogatja a térbeli adatokat és a térbeli indexeket. A térbeli index egy kiterjesztett indextípus, amely lehetővé teszi a térbeli oszlopok indexelésére. A térbeli oszlopok olyan táblaoszlopok, amelyek térbeli adattípusú adatokat tartalmaznak, például geometriai vagy földrajzi.

Tip

Az SQL Server térbeli eszközei a Microsoft által szponzorált nyílt forráskódú eszközök gyűjteménye, amelyek az SQL Server térbeli típusaival használhatók. Ez a projekt olyan újrafelhasználható függvényeket biztosít, amelyeket az alkalmazások használhatnak. Ezek a függvények lehetnek adatkonvertálási rutinok, új átalakítások, összesítések stb. További részletekért lásd Microsoft/SQLServerSpatialTools a GitHubon.

Tudnivalók a térbeli indexekről

Indexelt tér felbontása rácshierarchiába

Az SQL Serverben a térbeli indexek B-fák használatával vannak létrehozva, ami azt jelenti, hogy az indexek a kétdimenziós térbeli adatokat a B-fák lineáris sorrendjében kell jelölniük. Ezért az adatok térbeli indexbe való beolvasása előtt az SQL Server hierarchikus egységes térelbontást valósít meg. Az indexlétrehozás folyamata a teret négyszintű rácshierarchiábabontja. Ezeket a szinteket 1. szint (a legfelső szint), 2. szint, 3. szint, és 4. szint.

Minden egymást követő szint tovább bontja a fölötte lévő szintet, így minden felső szintű cella egy teljes rácsot tartalmaz a következő szinten. Egy adott szinten az összes rács ugyanolyan számú cellával rendelkezik mindkét tengely mentén (például 4x4 vagy 8x8), és a cellák mind egy méretűek.

Az alábbi ábrán látható, hogyan bomlik fel a jobb felső cella a rácshierarchia minden egyes szintjén egy 4x4-es rácsra. A valóságban az összes cella így bomlik le. Így például egy tér négy 4x4-es rácsszintre bontása valójában összesen 65 536 négyes szintű cellát eredményez.

Rekurzív tesselláció négy szintje

Note

A térbeli index térbeli felbontása független az alkalmazásadatok által használt mértékegységétől.

A rácshierarchia cellái lineárisan vannak számba írva a Hilbert térkitöltési görbe egyik változatával. Az illusztráció érdekében azonban ez a vita soronkénti számozást használ a Hilbert-görbe által előállított számozás helyett. Az alábbi ábrán az épületeket és az utcákat jelképező sokszögek már egy 4x4-es, 1. szintű rácsba kerültek. Az 1. szintű cellák számozása 1 és 16 között történik, kezdve a bal felső cellával.

4x4-es szint-1 rácsba helyezett sokszögek és vonalak

Rács sűrűsége

A rács tengelyei mentén lévő cellák száma határozza meg a rács sűrűségét: minél nagyobb a szám, annál sűrűbb a rács. Például a 8x8 rács (amely 64 cellát állít elő) sűrűbb, mint egy 4x4 rács (amely 16 cellát állít elő). A rács sűrűsége szintenkénti alapon van meghatározva.

A CREATE SPATIAL INDEXTransact-SQL utasítás támogatja a GRIDS záradékot, amely lehetővé teszi különböző rácssűrűségek különböző szinteken történő megadását. Egy adott szint rácssűrűségét az alábbi kulcsszavak egyikével adtuk meg.

Keyword Rácskonfiguráció Cellák száma
LOW 4X4 16
MEDIUM 8X8 64
HIGH 16X16 256

Az SQL Serverben, ha az adatbázis kompatibilitási szintje 100-ra vagy alacsonyabbra van állítva, akkor az alapértelmezett érték a MEDIUM minden szinten. Ha az adatbázis kompatibilitási szintje 110 vagy annál magasabb, akkor az alapértelmezett érték egy automatikus rácsséma. (Az automatikus rács a HLLLLLLL 8 szintű konfigurációját jelzi.) A változó indexrács-sűrűség helyett objektumonként eltérő cellákat és objektumonkénti ablakcellák lekérdezését végezheti el tippeléssel.

A felbontási folyamatot a nem alapértelmezett rácssűrűségek megadásával szabályozhatja. Például a különböző szintek különböző rácssűrűségei hasznosak lehetnek az indexek finomhangolásához az indexelt tér mérete és a térbeli oszlopban lévő objektumok alapján.

Note

A térbeli index rácssűrűségei a sys.spatial_index_tessellations katalógusnézet level_1_grid, level_2_grid, level_3_grid és level_4_grid oszlopaiban láthatók, ha az adatbázis kompatibilitási szintje 100 vagy annál alacsonyabb. A GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tessellation séma beállításai nem töltik fel ezeket az oszlopokat. sys.spatial_index_tessellations katalógusnézet az automatikus rácsbeállítások használatakor NULL értékeket tartalmaz ezekhez az oszlopokhoz.

Tessellation

Az indexelt tér rácshierarchiába való felbontása után a térbeli index sorról sorra beolvassa az adatokat a térbeli oszlopból. A térbeli objektum (vagy példány) adatainak beolvasása után a térbeli index egy tessellációs folyamatot hajt végre, az adott objektumhoz. A tessellation folyamat az objektumot a rácshierarchiába illeszti úgy, hogy az objektumot azokkal a rácscellákkal társítja, amelyeket érint (érintett cellák). A rácshierarchia 1. szintjén kezdődően a tessellation folyamat teljes első halad végig a szinten. Lehetséges, hogy a folyamat végighaladhat mind a négy szinten, egyszerre egy szinten.

A tessellációs folyamat kimenete az objektum térbeli indexében rögzített megérintett cellák halmaza. Ezekre a rögzített cellákra hivatkozva a térbeli index képes meghatározni az objektum helyét a térbeli oszlopban lévő többi objektumhoz viszonyítva.

Tessellation szabályok

Az objektumhoz rögzített megérintett cellák számának korlátozásához a tessellációs folyamat több tessellációs szabályt alkalmaz. Ezek a szabályok határozzák meg a tessellációs folyamat mélységét, és hogy az érintett cellák közül melyik szerepel az indexben.

Ezek a szabályok a következők:

  • A fedezeti szabály

    Ha az objektum teljesen lefed egy cellát, a rendszer azt állítja, hogy az objektum fedi le. Egy fedett cella megszámolva van, és nem tessellatos. Ez a szabály a rácshierarchia minden szintjén érvényes. A lefedési szabály leegyszerűsíti a tessellációs folyamatot, és csökkenti a térbeli index által rögzített adatok mennyiségét.

  • A cellák objektumonkénti szabálya

    Ez a szabály kikényszeríti az objektumonkénticellakorlátot, amely meghatározza az egyes objektumokhoz megszámlálható cellák maximális számát, kivéve az 1. szinten. Alacsonyabb szinteken az objektumonkénti cellaszabály szabályozza az objektumról rögzíthető információk mennyiségét.

  • A legmélyebb cellaszabály

    A legmélyebb cellaszabály úgy hozza létre az objektum legjobb közelítését, hogy csak a legalsó cellákat rögzíti, amelyek az objektum számára lettek mozaikozva. A szülőcellák nem járulnak hozzá az objektumonkénti cellák számához, és nem szerepelnek az indexben.

Ezeket a tessellációs szabályokat rekurzívan alkalmazza a rendszer minden rácsszinten. A szakasz további része részletesebben ismerteti a tessellation szabályokat.

Lefedési szabály

Ha egy objektum teljesen lefed egy cellát, a rendszer azt mondja, hogy az objektum fedi le. Az alábbi ábrán például az egyik második szintű cellát, a 15.11-et teljesen lefedi egy nyolcszög középső része.

Fedésoptimalizálás

A rendszer egy lefedett cellát számlál meg és rögzít az indexben, a cellát pedig nem szelektálta tovább.

Cella per objektum szabály

Az egyes objektumok tessellációjának mértéke elsősorban a térbeli index cellákra vonatkozó korlátjától függ. Ez a korlát határozza meg, hogy tesszellációval objektumonként hány cella számolható meg maximálisan. Vegye figyelembe azonban, hogy a cellák objektumonkénti szabálya nincs kényszerítve az 1. szinten, így túlléphető ez a korlát. Ha az 1. szint száma eléri vagy meghaladja a cellák objektumonkénti korlátját, az alsó szinteken nem történik további tesselláció.

Amíg a szám kisebb, mint a cellák objektumonkénti korlátja, a tessellációs folyamat folytatódik. A legalacsonyabb számmal rendelkező megérintett cellával kezdve (például az előző ábrán látható 15,6-os cella), a folyamat minden egyes cellát tesztel annak kiértékelésére, hogy megszámolja-e vagy mozaikszerűen kitölti-e. Ha egy cella tessellatása meghaladja az objektumonkénti cellakorlátot, a cella megszámlálva lesz, és nem tessellat. Ellenkező esetben a cella tessellatos, és az objektum által megérintett alsó szintű cellák meg vannak számlálva. A tesszellációs folyamat így folytatódik, széltében, a szint mentén. Ez a folyamat rekurzív módon ismétlődik a tessellált cellák alsóbb szintű rácsainál, amíg el nem éri a korlátot, vagy nincs több megszámlálható cella.

Vegyük például az előző ábrát, amely egy nyolcszöget jelenít meg, amely teljesen illeszkedik az 1. szintű rács 15. cellájába. Az ábrán a 15. cella tesszelálva van, amely a nyolcszöget kilenc szint-2-es cellára bontja. Ez az ábra azt feltételezi, hogy a cellák objektumonkénti korlátja 9 vagy több. Ha azonban az objektumonkénti cellakorlát 8 vagy annál kisebb lenne, akkor a 15. cella nem lesz tesszellálva, és csak a 15. cellát veszik figyelembe az objektumhoz.

Alapértelmezés szerint a cellák objektumonkénti korlátja objektumonként 16 cella, amely kielégítő kompromisszumot biztosít a tér és a pontosság között a legtöbb térbeli index esetében. A CREATE SPATIAL INDEXTransact-SQL utasítás azonban támogatja a CELLS_PER_OBJECT =n záradékot, amely lehetővé teszi, hogy objektumonkénti korlátot adjon meg 1 és 8192 között.

Note

A térbeli index cells_per_object beállítása látható a sys.spatial_index_tessellations katalógusnézetben.

Legmélyebb-sejt szabály

A legmélyebb cellaszabály kihasználja azt a tényt, hogy minden alsó szintű cella a fölötte lévő cellához tartozik: egy 4. szintű cella egy 3. szintű cellához, egy 3. szintű cella egy 2. szintű cellához, egy 2. szintű cella pedig egy 1. szintű cellához tartozik. Az 1.1.1.1 cellához tartozó objektumok például az 1.1.1, az 1.1 és az 1. cellába is tartoznak. Az ilyen cellahierarchia-kapcsolatok ismerete be van építve a lekérdezésfeldolgozóba. Ezért csak a legmélyebb szintű cellákat kell rögzíteni az indexben, minimalizálva az index által tárolandó információkat.

Az alábbi ábrán egy viszonylag kis rombusz alakú sokszög van kitöltve. Az index az objektumonkénti alapértelmezett 16-os korlátot használja, amely nem érhető el ehhez a kis objektumhoz. Ezért a tessellation továbbra is a 4. szintre csökken. A sokszög a következő 1. szint és a 3. szint cellái között található: 4, 4,4 és 4.4.10 és 4.4.14. A legmélyebb cellaszabály használatával azonban a tesselláció csak a tizenkét 4. szintű cellát számlálja meg: 4.4.10.13-15 és 4.4.14.1-3, 4.4.14.5-7 és 4.4.14.9-11.

legmélyebb cellaoptimalizálás

Tessellation-sémák

A térbeli index viselkedése részben a tessellációs sémájátólfügg. A tessellation séma adattípus-specifikus. Az SQL Serverben a térbeli indexek két tessellációs sémát támogatnak:

  • Geometriai rács csempézés, amely a geometria adattípus sémája.

  • A földrajzi rács tesszelációja, amely a földrajzi adattípus oszlopaira vonatkozik.

Note

A térbeli index tessellation_scheme beállítása látható a sys.spatial_index_tessellations katalógusnézetben.

Geometriai Rács Mozaik Séma

GEOMETRY_AUTO_GRID tessellation az SQL Server 2012 (11.x) és újabb verziói geometria adattípusának alapértelmezett tessellációs sémája. GEOMETRY_GRID tessellation az egyetlen tessellation séma, amely az SQL Server 2008(10.0.x) geometriai adattípusaihoz érhető el. Ez a szakasz a geometriai rács tessellációjának olyan aspektusait ismerteti, amelyek relevánsak a térbeli indexek használata szempontjából: támogatott metódusok és határolókeretek.

Note

Megadhatja ezt a tessellációs sémát a CREATE SPATIAL INDEX Transact-SQL utasításban a USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) záradék használatával.

A határolókeret

A geometriai adatok olyan síkot foglalnak el, amely végtelen lehet. Az SQL Serverben azonban a térbeli indexek véges helyet igényelnek. A bontás véges térének létrehozásához a geometriai rács tesszellációs sémája téglalap alakú határolódoboztigényel. A határolókeretet négy koordináta határozza meg, (x-min,y-min) és (x-max,y-max), amelyek a térbeli index tulajdonságaiként vannak tárolva. Ezek a koordináták a következőket jelölik:

  • x-min a határolókeret bal alsó sarkának x koordinátája.

  • y-min a bal alsó sarok y koordinátája.

  • x-max a jobb felső sarok x koordinátája.

  • y-max a jobb felső sarok y koordinátája.

Note

Ezeket a koordinátákat a CREATE SPATIAL INDEXTransact-SQL utasítás BOUNDING_BOX záradéka határozza meg.

A (x-min,y-min) és (x-max,y-max) koordináták határozzák meg a határolókeret elhelyezését és méretét. A határolódobozon kívüli teret egyetlen cellának kezelik, amelynek száma 0.

A térbeli index felbontja a határolókereten belüli területet. A rácshierarchia 1. szintű rácsa kitölti a határolókeretet. Ha geometriai objektumot szeretne elhelyezni a rácshierarchiában, a térbeli index összehasonlítja az objektum koordinátáit a határolókeret koordinátáival.

Az alábbi ábrán a (x-min,y-min) és (x-max,y-max) koordináták által meghatározott pontok láthatók a határolókeret. A rácshierarchia legfelső szintje 4x4-es rácsként jelenik meg. A szemléltetés céljából az alacsonyabb szintek kimaradnak. A határolókereten kívüli teret nulla (0) jelöli. Vegye figyelembe, hogy az "A" objektum részben túlnyúlik a dobozon, a "B" objektum pedig teljesen kívül esik a 0 cellában lévő dobozon.

határolókeret a koordinátákat és a 0. cellát jeleníti meg.

A határolókeret az alkalmazás térbeli adatainak egy részével egyezik meg. Az alkalmazáson múlik, hogy az index határolókerete teljesen tartalmazza-e a térbeli oszlopban tárolt adatokat, vagy csak egy részt tartalmaz. A térbeli indexet csak olyan objektumokon kiszámított műveletek élvezhetik, amelyek teljes egészében a határolókereten belül találhatók. Ezért annak érdekében, hogy a geometria oszlopán lévő térbeli indexből a lehető legnagyobb előnyt szerezze, meg kell adnia egy határolókeretet, amely az összes vagy a legtöbb objektumot tartalmazza.

Note

A térbeli index rácssűrűségei megtekinthetők a sys.spatial_index_tessellations katalógusnézet bounding_box_xmin, bounding_box_ymin, bounding_box_xmax és bounding_box_ymax oszlopaiban.

A Földrajzi rács mozaik kialakítási terv

Ez a tessellációs séma csak egy földrajzi oszlopra vonatkozik. Ez a szakasz összefoglalja a földrajzi rácsok tessellációja által támogatott módszereket, és ismerteti, hogyan vetül a geodéziai tér egy síkra, amely aztán rácshierarchiává lesz bontva.

Note

Ezt a tessellációs sémát a CREATE SPATIAL INDEXTransact-SQL utasítás USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) záradékával adhatja meg.

A geodéziai tér vetítése síkra

A földrajzi objektumok (példányok) számításai az objektumokat tartalmazó teret geodéziai ellipszoidként kezelik. A tér lebontásához a földrajzi rács tessellációs sémája felosztja az ellipszoid felületét a felső és az alsó féltekére, majd végrehajtja a következő lépéseket:

  1. Az egyes félgömböket egy négyszög alakú piramis oldalára vetíti.

  2. Lapítja le a két piramist.

  3. Összekapcsolja az összesimított piramisokat, hogy egy nem euklideszi síkot alkotjanak.

Az alábbi ábrán a háromlépéses felbontási folyamat sematikus nézete látható. A piramisokban a pontozott vonalak az egyes piramisok négy aspektusának határait jelölik. Az 1. és a 2. lépés a geodéziai ellipszoidot szemlélteti, egy zöld vízszintes vonallal, amely az Egyenlítőt jelképezi, és egy sor zöld függőleges vonallal, amelyek több hosszúsági vonalat ábrázolnak. Az 1. lépés a két féltekére vetített piramisokat mutatja. A 2. lépés az összesimított piramisokat mutatja. A 3. lépés az összesimított piramisokat szemlélteti, miután egyesítették őket egy síkká, és számos kivetített hosszúsági vonalat mutat. Figyelje meg, hogy ezek az előrejelzett vonalak egyenesek, és hosszúságuk változó, attól függően, hogy hol esnek a piramisokra.

Az ellipszoid vetülete egy síkra

Miután a tér fel lett vetítve a síkra, a sík felbomlik a négyszintű rácshierarchiába. A különböző szintek különböző rácssűrűségeket használhatnak. Az alábbi ábra mutatja a síkot, miután felbomlott egy 4x4-es szint-1 rácsra. Az ábrán a rácshierarchia alsó szintjei nem jelennek meg. Valójában a sík teljes mértékben négyszintű rácshierarchiává lesz bontva. A felbontási folyamat befejeződése után a földrajzi adatokat sorról sorra beolvassák a földrajzi oszlopból, és az egyes objektumok esetében a tessellációs folyamatot hajtják végre.

1. szintű földrajzi rács

Térbeli indexek által támogatott metódusok

Térbeli indexek által támogatott geometriai módszerek

A térbeli indexek bizonyos feltételek mellett támogatják a következő halmazorientált geometriai módszereket: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() és STWithin(). A térbeli indexek támogatásához ezeket a metódusokat a lekérdezés WHERE vagy JOIN ON záradékában kell használni, és azokat a következő általános forma predikátumán belül kell alkalmazni:

geometry1.method_name(geometry2)comparison_operator**valid_number

A nem null értékű eredmény visszaadásához geometria1 és geometria2 azonos térbeli referenciaazonosítóval (SRID)kell rendelkeznie. Ellenkező esetben a metódus NULL értéket ad vissza.

A térbeli indexek a következő predikátumformákat támogatják:

Térbeli indexek által támogatott földrajzi módszerek

Bizonyos feltételek mellett a térbeli indexek a következő készletorientált földrajzi módszereket támogatják: STIntersects(),STEquals() és STDistance(). A térbeli indexek támogatásához ezeket a metódusokat a lekérdezés WHERE záradékában kell használni, és azokat a következő általános forma predikátumán belül kell alkalmazni:

geography1.method_name(geography2)comparison_operator**valid_number

Nem null értékű eredmény visszaadásához földrajzi 1 és földrajzi hely2 azonos térbeli referenciaazonosítóval (SRID)kell rendelkeznie. Ellenkező esetben a metódus NULL értéket ad vissza.

A térbeli indexek a következő predikátumformákat támogatják:

Térbeli indexeket használó lekérdezések

A térbeli indexek csak olyan lekérdezésekben támogatottak, amelyek indexelt térbeli operátort tartalmaznak a WHERE záradékban. Például szintaxis, például:

[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]  

A lekérdezésoptimalizáló megérti a térbeli műveletek inmutativitását (ez @a.STIntersects(@b) = @b.STIntersects(@a)). A térbeli indexet azonban nem használja a rendszer, ha az összehasonlítás kezdete nem tartalmazza a térbeli operátort (például WHERE 1 = spatial op nem használja a térbeli indexet). A térbeli index használatához írja át az összehasonlítást (például WHERE spatial op = 1).

Mint minden más index esetében, ha a térbeli index támogatott, a térbeli index használata költség alapján történik, így előfordulhat, hogy a lekérdezésoptimalizáló nem fogja használni a térbeli indexet, annak ellenére, hogy az összes használati követelmény teljesül. A showplan használatával ellenőrizze, hogy a térbeli indexet használták-e, és ha szükséges, adjon meg lekérdezési tippeket a kívánt lekérdezésterv kikényszerítéséhez.

A legközelebbi szomszéd típusú lekérdezés a térbeli indexeket is támogatja, de csak akkor, ha egy adott lekérdezési szintaxis van megírva. A megfelelő szintaxis a következő:

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

Lásd még:

térbeli adatok (SQL Server)