Přehled prostorových indexů
platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Database v Microsoft Fabric
SQL Server podporuje prostorová data a prostorové indexy. prostorový index je typ rozšířeného indexu, který umožňuje indexovat prostorový sloupec. Prostorový sloupec je sloupec tabulky, který obsahuje data prostorového datového typu, například geometrii nebo geografie.
Spropitné
SQL Server spatial tools je sponzorovaná opensourcová kolekce nástrojů od Microsoftu pro použití s prostorovými typy na SQL Serveru. Tento projekt poskytuje sadu opakovaně použitelných funkcí, které můžou aplikace využívat. Tyto funkce mohou zahrnovat rutiny převodu dat, nové transformace, agregace atd. Další podrobnosti najdete v tématu Microsoft/SQLServerSpatialTools na GitHubu.
Informace o prostorových indexech
Rozložení indexovaného prostoru do hierarchie mřížky
V SQL Serveru se prostorové indexy vytvářejí pomocí stromů B, což znamená, že indexy musí představovat dvojrozměrná prostorová data v lineárním pořadí stromů B. Proto SQL Server před čtením dat do prostorového indexu implementuje hierarchický jednotný rozklad prostoru. Proces vytváření indexu rozloží prostor do čtyřúrovňové hierarchie mřížky. Tyto úrovně se označují jako úroveň 1 (nejvyšší úroveň), úroveň 2, úroveň 3a úroveň 4.
Každá následná úroveň dále rozloží úroveň nad ní, takže každá buňka horní úrovně obsahuje úplnou mřížku na další úrovni. Na dané úrovni mají všechny mřížky stejný počet buněk podél obou os (například 4x4 nebo 8x8) a všechny buňky mají jednu velikost.
Následující obrázek znázorňuje rozklad buňky v pravém horním rohu na každé úrovni mřížkové hierarchie do mřížky o velikosti 4x4. Ve skutečnosti jsou všechny buňky tímto způsobem rozloženy. Proto například rozdělení prostoru do čtyř úrovní mřížky 4x4 ve skutečnosti vytváří celkem 65 536 buněk úrovně čtyři.
Poznámka
Rozklad prostoru prostorového indexu je nezávislý na měrné jednotce, kterou data aplikace používají.
Buňky hierarchie mřížky jsou číslovány lineárním způsobem pomocí variace křivky Hilbert pro vyplňování prostoru. Pro účely ilustrace však tato diskuze používá jednoduché číslování s řádky namísto číslování, které je skutečně vytvořeno hilbertovou křivkou. Na následujícím obrázku je několik mnohoúhelníku, které představují budovy a čáry představující ulice, již byly umístěny do mřížky 4x4 úrovně 1. Buňky úrovně 1 jsou očíslovány od 1 do 16, počínaje levou horní buňkou.
Hustota mřížky
Počet buněk podél os mřížky určuje jeho hustotu: čím větší je číslo, hustší mřížka. Například mřížka 8x8 (která vytváří 64 buněk), je hustší než mřížka 4x4 (která vytváří 16 buněk). Hustota mřížky je definována na základě jednotlivých úrovní.
Příkaz CREATE SPATIAL INDEXTransact-SQL podporuje klauzuli GRIDS, která umožňuje zadat různé hustoty mřížky na různých úrovních. Hustota mřížky pro danou úroveň je určena pomocí jednoho z následujících klíčových slov.
Klíčové slovo | Konfigurace mřížky | Počet buněk |
---|---|---|
NÍZKÝ | 4X4 | 16 |
STŘEDNÍ | 8X8 | 64 |
VYSOKO | 16X16 | 256 |
Pokud je na SQL Serveru nastavena úroveň kompatibility databáze na 100 nebo nižší, je výchozí hodnota MEDIUM na všech úrovních. Pokud je úroveň kompatibility databáze nastavená na 110 nebo vyšší, pak je výchozí schéma automatické mřížky. (Automatická mřížka označuje 8úrovňovou konfiguraci HLLLLLLL.) Místo proměnlivé hustoty mřížky indexu můžete prostřednictvím náznaku měnit buňky na objekt a buňky dotazovacího okna na objekt.
Proces rozkladu můžete řídit zadáním ne defaultních hustot mřížky. Například různé hustoty mřížky na různých úrovních můžou být užitečné pro vyladění indexu na základě velikosti indexovaného prostoru a objektů v prostorovém sloupci.
Poznámka
Hustoty mřížky prostorového indexu jsou viditelné v level_1_grid, level_2_grid, level_3_grid a level_4_grid sloupcích zobrazení katalogu sys.spatial_index_tessellations, pokud je úroveň kompatibility databáze nastavená na 100 nebo nižší. Možnosti schématu teselace GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tyto sloupce nenaplní. sys.spatial_index_tessellations pohled katalogu má hodnoty NULL pro tyto sloupce, když jsou použity možnosti automatické mřížky.
Vzájemné skládání
Po rozkladu indexovaného prostoru do hierarchie mřížky prostorový index načte data z prostorového sloupce řádek po řádku. Po přečtení dat prostorového objektu (nebo instance) provede prostorový index proces tessellation pro daný objekt. Proces tessellation umísťuje objekt do hierarchie mřížky tím, že objekt přidružuje k sadě buněk mřížky, kterých se dotýká (dotknuté buňky). Od úrovně 1 hierarchie mřížky pokračuje proces tessellation první na úrovni. Proces může potenciálně pokračovat ve všech čtyřech úrovních, vždy po jedné úrovni.
Výstupem procesu tessellation je sada dotkovaných buněk, které jsou zaznamenány v prostorovém indexu objektu. Odkazem na tyto zaznamenané buňky může prostorový index najít objekt v prostoru vzhledem k jiným objektům v prostorovém sloupci, které jsou také uloženy v indexu.
Pravidla Tessellation
Pokud chcete omezit počet dotčených buněk, které jsou zaznamenány pro objekt, aplikuje proces tesselace několik pravidel tesselace. Tato pravidla určují hloubku procesu tessellation a které z dotkovaných buněk se zaznamenávají do indexu.
Tato pravidla jsou následující:
Pravidlo pokrytí
Pokud objekt zcela zakrývá buňku, znamená to, že je buňka pokryta objektem. Buňka, která je zahrnutá, se počítá a není dlaždicově rozdělena. Toto pravidlo platí na všech úrovních hierarchie mřížky. Pravidlo pokrytí zjednodušuje proces teselace a snižuje množství dat, která prostorový index zaznamenává.
Pravidlo buněk na objekt
Toto pravidlo vynucuje limit buněk na objekt, který určuje maximální počet buněk, které lze spočítat pro každý objekt s výjimkou úrovně 1. Na nižších úrovních řídí pravidlo buněk na objekt množství informací, které lze zaznamenat o objektu.
Nejsouhlší pravidlo buňky
Pravidlo pro nejhlubší buňky generuje nejlepší aproximaci objektu tím, že zaznamenává pouze nejspodnější buňky, které byly pro objekt tesselovány. Nadřazené buňky nepřispívají k počtu buněk na objekt a nejsou zaznamenány v indexu.
Tato pravidla tessellation se použijí rekurzivně na každé úrovni mřížky. Zbytek této části podrobněji popisuje pravidla tessellation.
Pravidlo o zakrytí
Pokud objekt zcela zakrývá buňku, znamená to, že je buňka pokryta objektem. Například na následujícím obrázku je jedna z buněk druhé úrovně 15,11 zcela pokryta prostřední částí osmiúhelníku.
Zahrnutá buňka se počítá a zaznamenává v indexu a buňka není dále tesselována.
Buňky – pravidloPer-Object
Rozsah tesselace každého objektu závisí především na limitu buněk na objekt prostorového indexu . Tento limit definuje maximální počet buněk, které může tesselace spočítat na jeden objekt. Všimněte si však, že pravidlo buněk na objekt není vynuceno pro úroveň 1, takže je možné tento limit překročit. Pokud počet úrovně 1 dosáhne, nebo překročí, limit buněk na objekt, nedojde k žádné další tesselaci na nižších úrovních.
Dokud je počet menší než limit buněk na objekt, pokračuje proces tessellation. Počínaje buňkou s nejnižším dotčeným číslem (například buňkou 15,6 na předchozím obrázku) proces testuje každou buňku, aby zjistil, zda ji má spočítat nebo mozaikovat. Pokud by tessellatace buňky překročila limit buněk na objekt, je buňka počítána a není tessellatována. V opačném případě je buňka rozdělena a buňky nižší úrovně, které jsou ovlivněny objektem, jsou počítány. Proces teselace pokračuje tímto způsobem, v širokém rozsahu po celé úrovni. Tento proces se opakuje rekurzivně pro mřížky nižších úrovní dlaždicových buněk, dokud není dosaženo limitu nebo nejsou k dispozici žádné další buňky k počítání.
Představte si například předchozí obrázek, který znázorňuje osmiúhelník, který se zcela zapadne do buňky 15 mřížky úrovně 1. Na obrázku je buňka 15 rozdělena na dlaždice, čímž se osmiúhelník rozděluje na devět buněk úrovně 2. Tento obrázek předpokládá, že limit buněk na objekt je 9 nebo více. Pokud by byl limit buněk na objekt 8 nebo méně, buňka 15 by však nebyla tessellatována a pouze buňka 15 by byla pro objekt počítána.
Ve výchozím nastavení je limit buněk na objekt 16 buněk, což poskytuje uspokojivý kompromis mezi mezerou a přesností pro většinu prostorových indexů. Příkaz CREATE SPATIAL INDEXTransact-SQL však podporuje klauzuli CELLS_PER_OBJECT =n, která umožňuje zadat limit buněk na objekt mezi 1 a 8192 (včetně).
Poznámka
Nastavení cells_per_object prostorového indexu je viditelné v katalogovém zobrazení sys.spatial_index_tessellations.
Pravidlo Deepest-Cell
Pravidlo hloubkové buňky využívá skutečnost, že každá buňka nižší úrovně patří do buňky nad ní: buňka úrovně 4 patří do buňky úrovně 3, buňka úrovně 3 patří do buňky úrovně 2 a buňka úrovně-2 patří do buňky úrovně 1. Například objekt, který patří do buňky 1.1.1.1, patří také do buňky 1.1.1, buňky 1.1 a buňky 1. Znalost takových relací hierarchie buněk je integrovaná do procesoru dotazů. Proto je potřeba v indexu zaznamenat pouze buňky nejhlubší úrovně, což minimalizuje informace, které index potřebuje uložit.
Na následujícím obrázku je relativně malý mnohoúhelník ve tvaru kosočtvercového tvaru. Index používá výchozí limit buněk na objekt 16, který není pro tento malý objekt dosažen. Proto tessellation pokračuje směrem dolů na úroveň 4. Mnohoúhelník se nachází v následujících buňkách úrovně 1 až 3 úrovně: 4, 4,4 a 4.4.10 a 4.4.14. Při použití pravidla nejhlubší buňky však tesselace počítá pouze dvanáct buněk úrovně-4: 4.4.10.13-15 a 4.4.14.1-3, 4.4.14.5-7 a 4.4.14.9-11.
Schémata Tessellation
Chování prostorového indexu částečně závisí na jeho schéma tessellation. Schéma tessellation je specifické pro datový typ. V SQL Serveru prostorové indexy podporují dvě schémata tessellation:
Tesselace mřížky geometrie, což je schéma pro datový typ geometrie.
mřížková tessellace geografie, která se vztahuje na sloupce datového typu zeměpisu.
Poznámka
Nastavení tessellation_scheme prostorového indexu je viditelné v katalogovém zobrazení sys.spatial_index_tessellations.
Schéma geometrické mřížky Tessellation
GEOMETRY_AUTO_GRID je výchozí schéma triangulace pro datový typ geometrie v SQL Serveru 2012 (11.x) a novějších verzích. GEOMETRY_GRID tessellation je jediné schéma tessellation dostupné pro datové typy geometrie v SQL Serveru 2008 (10.0.x). Tato část popisuje aspekty tesselace geometrické mřížky, které jsou relevantní pro práci s prostorovými indexy: podporované metody a ohraničující boxy.
Poznámka
Toto schéma tessellation můžete explicitně zadat pomocí klauzule USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) příkazu CREATE SPATIAL INDEX Transact-SQL.
Ohraničující rámeček
Geometrická data zabírají rovinu, která může být nekonečná. V SQL Serveru ale prostorový index vyžaduje konečný prostor. Aby bylo možné vytvořit definovaný prostor pro rozklad, schéma dělení mřížky geometrie vyžaduje obdélníkový ohraničující box . Ohraničující rámeček je definován čtyřmi souřadnicemi, (x min,y min) a (x-max,y-max), které jsou uloženy jako vlastnosti prostorového indexu. Tyto souřadnice představují následující:
x-min je souřadnice x v levém dolním rohu ohraničujícího rámečku.
y-min je y-souřadnice levého dolního rohu.
x-max je souřadnice x v pravém horním rohu.
y-max je y-souřadnice pravého horního rohu.
Poznámka
Tyto souřadnice jsou určeny klauzulí BOUNDING_BOX příkazu CREATE SPATIAL INDEXTransact-SQL.
(x-min,y-min) a (x-max,y-max) souřadnice určují umístění a rozměry ohraničujícího rámečku. Mezera mimo ohraničující rámeček je považována za jednu buňku, která má číslo 0.
Prostorový index rozloží mezeru uvnitř ohraničujícího rámečku. Mřížka úrovně 1 hierarchie vyplní ohraničující rámeček. Pokud chcete umístit geometrický objekt do hierarchie mřížky, prostorový index porovnává souřadnice objektu se souřadnicemi ohraničujícího rámečku.
Následující obrázek ukazuje body definované souřadnicemi (x-min,y-min) a (x-max,y-max) ohraničujícího rámečku. Nejvyšší úroveň hierarchie mřížky se zobrazuje jako mřížka 4x4. Pro účely ilustrace jsou vynechány nižší úrovně. Mezera mimo ohraničující rámeček je označena nulou (0). Všimněte si, že objekt "A" částečně přesahuje rámeček a objekt "B" leží zcela mimo pole v buňce 0.
Ohraničující rámeček odpovídá určité části prostorových dat aplikace. Ať už ohraničující rámeček indexu zcela obsahuje data uložená v prostorovém sloupci, nebo jen jejich část, záleží na aplikaci. Výhody prostorového indexu mají pouze operace vypočítané u objektů, které jsou zcela uvnitř ohraničujícího rámečku. Pokud tedy chcete získat největší výhodu prostorového indexu na sloupci geometrie , musíte zadat ohraničovací rámeček, který obsahuje všechny objekty nebo většinu objektů.
Poznámka
Hustoty mřížky prostorového indexu jsou viditelné ve sloupcích bounding_box_xmin, bounding_box_ymin, bounding_box_xmax a bounding_box_ymax v zobrazení katalogu sys.spatial_index_tessellations.
Schéma dlaždicování zeměpisné mřížky
Toto tessellační schéma se vztahuje pouze na zeměpisný sloupec . Tato část shrnuje metody podporované tesselací geografické mřížky a popisuje, jak se geodetický prostor promítá do roviny, která je následně rozdělena do hierarchie mřížky.
Poznámka
Toto schéma tessellation můžete explicitně zadat pomocí klauzule USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) příkazu CREATE SPATIAL INDEXTransact-SQL.
Projekce geodetického prostoru na rovinu
Výpočty na instancích (objektech) v rámci zeměpisné oblasti zpracovávají prostor obsahující tyto objekty jako geodetický elipsoid. Aby se tento prostor rozložil, rozčlení schéma dlaždičkování geografické mřížky povrch elipsoidu na horní a spodní polokouli a pak provede následující kroky:
Promítá každou polokouli na fasety čtyřúhelníku.
Zplošťuje dva jehlany.
Spojí zploštělé pyramidy a vytvoří ne euklidovou rovinu.
Následující obrázek znázorňuje schéma třístupňového procesu rozkladu. V jehlanech tečkované čáry představují hranice čtyř stran každé pyramidy. Kroky 1 a 2 znázorňují geodetický elipsoid pomocí zelené vodorovné čáry představující rovníkovou zeměpisnou čáru a řadu zelených svislých čar představujících několik čar délky. Krok 1 ukazuje jehlany promítané na dvě polokoule. Krok 2 ukazuje, jak jsou pyramidy zploštěny. Krok 3 znázorňuje zploštělé pyramidy, které byly po sloučení upraveny do roviny a na kterých je znázorněna řada promítaných poledníkových čar. Všimněte si, že tyto projektované čáry jsou narovnané a jejich délka se liší podle toho, kam dopadají na pyramidy.
Jakmile je prostor promítnut do roviny, rovina se rozloží do čtyřúrovňové hierarchie mřížky. Různé úrovně můžou používat různé hustoty mřížky. Následující obrázek znázorňuje rovinu poté, co byla rozložena do mřížky úrovně 1 s rozměry 4x4. Pro účely ilustrace jsou vynechány nižší úrovně hierarchie mřížky. Ve skutečnosti je rovina plně rozdělená do čtyřúrovňové hierarchie mřížky. Po dokončení procesu rozkladu se geografická data čtou řádek po řádku ze sloupce geografie a proces tesselace se provádí postupně pro každý objekt.
Metody podporované prostorovými indexy
Metody geometrie podporované prostorovými indexy
Prostorové indexy podporují následující metody geometrie orientované na sadu za určitých podmínek: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() a STWithin(). Tyto metody musí být podporovány prostorovým indexem v rámci klauzule WHERE nebo JOIN ON dotazu a musí k nim dojít v predikátu následující obecné formy:
geometrie1.method_name(geometry2)comparison_operator**valid_number
Pokud chcete vrátit nenulový výsledek, geometry1 a geometry2 musí mít stejný identifikátor prostorového odkazu (SRID). V opačném případě metoda vrátí hodnotu NULL.
Prostorové indexy podporují následující predikátové formuláře:
geometrie1.STContains(geometrie2) = 1
geometrie1.STEquals(geometrie2)= 1
geometrie1.STIntersects(geometrie2)= 1
geometrie1.STOverlaps(geometrie2) = 1
geometrie1.STTouches(geometrie2) = 1
geometrie1.STWithin(geometrie2)= 1
Geografické metody podporované prostorovými indexy
Za určitých podmínek podporují prostorové indexy následující metody set-orientované geografie: STIntersects(),STEquals() a STDistance(). Tyto metody musí být podporovány prostorovým indexem v rámci klauzule WHERE dotazu a musí k nim dojít v predikátu následující obecné formy:
zeměpis1.method_name(zeměpis2)comparison_operator**valid_number
Pokud chcete vrátit výsledek, který není null, zeměpis1 a zeměpis2 musí mít stejný identifikátor prostorového odkazu (SRID). V opačném případě metoda vrátí hodnotu NULL.
Prostorové indexy podporují následující predikátové formuláře:
geografie1.STIntersects(geografie2)= 1
geografie1.STEquals(geografie2)= 1
zeměpis1 .stDistance ( zeměpis2 )
Dotazy, které používají prostorové indexy
Prostorové indexy jsou podporovány pouze v dotazech, které obsahují indexovaný prostorový operátor v klauzuli WHERE. Například syntaxe:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Optimalizátor dotazů rozumí komutativitě prostorových operací (to @a.STIntersects(@b) = @b.STIntersects(@a)
). Prostorový index se však nepoužije, pokud začátek porovnání neobsahuje prostorový operátor (například WHERE 1 = spatial op
nebude prostorový index používat). Pokud chcete použít prostorový index, přepište porovnání (například WHERE spatial op = 1
).
Stejně jako u jakéhokoli jiného indexu se při podpoře prostorového indexu vybere použití prostorového indexu na základě nákladů, takže se optimalizátor dotazů nemusí rozhodnout použít prostorový index, i když jsou splněny všechny požadavky na jeho použití. Pomocí showplanu zjistěte, zda byl použit prostorový index, a v případě potřeby poskytněte nápovědy pro dotazy k vynucení požadovaného plánu dotazu.
Nejbližší typ dotazu podporuje také prostorové indexy, ale pouze v případě, že se zapíše konkrétní syntaxe dotazu. Odpovídající syntaxe je:
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) [;]
Viz také