Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Program SQL Server obsługuje dane przestrzenne i indeksy przestrzenne. Indeks przestrzenny to typ indeksu rozszerzonego, który umożliwia indeksowanie kolumny przestrzennej. Kolumna przestrzenna to kolumna tabeli zawierająca dane typu danych przestrzennych, takich jak geometria lub lokalizacja geograficzna.
Tip
Narzędzia przestrzenne programu SQL Server to sponsorowana przez firmę Microsoft kolekcja narzędzi typu open source do użycia z typami przestrzennymi w programie SQL Server. Ten projekt udostępnia zestaw funkcji wielokrotnego użytku, z których mogą korzystać aplikacje. Te funkcje mogą obejmować procedury konwersji danych, nowe przekształcenia, agregacje itp. Aby uzyskać więcej informacji, zobacz Microsoft/SQLServerSpatialTools w usłudze GitHub.
Informacje o indeksach przestrzennych
Podział indeksowanej przestrzeni na hierarchię siatki
W programie SQL Server indeksy przestrzenne są tworzone przy użyciu drzew B, co oznacza, że indeksy muszą reprezentować 2-wymiarowe dane przestrzenne w kolejności liniowej drzew B. W związku z tym przed odczytaniem danych do indeksu przestrzennego program SQL Server implementuje hierarchiczną jednolitą dekompozycję przestrzeni. Proces tworzenia indeksu rozkłada przestrzeń w hierarchię siatki na poziomie czterech poziomów. Te poziomy są określane jako poziom 1 (najwyższy poziom), poziom 2, poziom 3 i poziom 4.
Każdy kolejny poziom dekomponuje poziom powyżej, więc każda komórka wyższego poziomu zawiera całą strukturę siatki na kolejnym poziomie. Na danym poziomie wszystkie siatki mają taką samą liczbę komórek wzdłuż obu osi (na przykład 4x4 lub 8x8), a komórki są jednym rozmiarem.
Poniższa ilustracja przedstawia dekompozycję komórki w prawym górnym rogu siatki na każdym poziomie hierarchii na siatkę 4x4. W rzeczywistości wszystkie komórki są rozłożone w ten sposób. W związku z tym, na przykład rozdzielając przestrzeń na cztery poziomy siatki 4x4, faktycznie uzyskuje się w sumie 65 536 komórek na czwartym poziomie.
Note
Dekompozycja miejsca dla indeksu przestrzennego jest niezależna od jednostki miary używanej przez dane aplikacji.
Komórki hierarchii siatki są numerowane w sposób liniowy przy użyciu odmiany krzywej wypełniania spacji Hilbert. Na potrzeby ilustracji, jednak ta dyskusja używa prostego numerowania wierszowego, zamiast numerowania, które jest faktycznie generowane przez krzywą Hilberta. Na poniższej ilustracji kilka wielokątów, które reprezentują budynki, oraz linie reprezentujące ulice zostały już umieszczone w siatce 4x4 poziomu 1. Komórki poziom-1 są numerowane z zakresu od 1 do 16, począwszy od lewej górnej komórki.
Gęstość siatki
Liczba komórek wzdłuż osi siatki określa jego gęstość: większą liczbę, gęstszą siatkę. Na przykład siatka 8x8 (tworząca 64 komórki) jest gęstsza niż siatka 4x4 (tworząca 16 komórek). Gęstość siatki jest definiowana dla każdego poziomu.
Instrukcja CREATE SPATIAL INDEXTransact-SQL obsługuje klauzulę GRIDS, która umożliwia określanie różnych gęstości siatki na różnych poziomach. Gęstość siatki dla danego poziomu jest określana przy użyciu jednego z następujących słów kluczowych.
| Keyword | Konfiguracja siatki | Liczba komórek |
|---|---|---|
| LOW | 4X4 | 16 |
| MEDIUM | 8X8 | 64 |
| HIGH | 16X16 | 256 |
W programie SQL Server, gdy poziom zgodności bazy danych jest ustawiony na 100 lub niższy, wartość domyślna to MEDIUM na wszystkich poziomach. Gdy poziom zgodności bazy danych jest ustawiony na 110 lub wyższy, wartością domyślną jest schemat automatycznej siatki. (Siatka automatyczna wskazuje konfigurację 8 poziomów HLLLLLLL). Zamiast zmieniać gęstość siatki indeksu, można różnicować liczbę komórek na obiekt oraz liczbę komórek w oknie zapytania na obiekt, wykorzystując wskazówki.
Proces dekompozycji można kontrolować, określając nie domyślne gęstości siatki. Na przykład różne gęstości siatki na różnych poziomach mogą być przydatne do dostrajania indeksu na podstawie rozmiaru indeksowanego miejsca i obiektów w kolumnie przestrzennej.
Note
Gęstości siatki indeksu przestrzennego są widoczne w kolumnach level_1_grid, level_2_grid, level_3_grid i level_4_grid widoku wykazu sys.spatial_index_tessellations, gdy poziom zgodności bazy danych zostanie ustawiony na 100 lub mniej. Opcje schematu GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID tessellation nie wypełniają tych kolumn. sys.spatial_index_tessellations widok katalogu ma wartości NULL dla tych kolumn, gdy używane są opcje automatycznej siatki.
Tessellation
Po dekompozycji indeksowanej przestrzeni na hierarchię siatki indeks przestrzenny odczytuje dane z kolumny przestrzennej, wiersz po wierszu. Po odczytaniu danych dla obiektu przestrzennego (lub wystąpienia) indeks przestrzenny wykonuje proces tessellacji dla tego obiektu. Proces tessellacji pasuje do hierarchii siatki przez skojarzenie obiektu z zestawem komórek siatki, które dotyka (dotykane komórki). Począwszy od poziomu 1 hierarchii siatki, proces tessellacji jest kontynuowany w pierwszej kolejności na poziomie. Potencjalnie proces może być kontynuowany przez wszystkie cztery poziomy, jeden poziom naraz.
Dane wyjściowe procesu tessellacji to zestaw dotykanych komórek, które są rejestrowane w indeksie przestrzennym obiektu. Odwołując się do tych zarejestrowanych komórek, indeks przestrzenny może zlokalizować obiekt w przestrzeni względem innych obiektów w kolumnie przestrzennej, które są również przechowywane w indeksie.
Reguły tessellacji
Aby ograniczyć liczbę komórek, które są rejestrowane jako dotknięte dla obiektu, proces teselacji stosuje kilka zasad teselacji. Te zasady określają głębokość procesu teselacji oraz to, które z dotykanych komórek są rejestrowane w indeksie.
Te reguły są następujące:
Reguła pokrycia
Jeśli obiekt całkowicie obejmuje komórkę, mówi się, że komórka jest objęta obiektem. Zakryta komórka jest liczona i nie jest mozaikowana. Ta reguła ma zastosowanie na wszystkich poziomach hierarchii siatki. Reguła pokrycia upraszcza proces tessellacji i zmniejsza ilość danych, które rejestruje indeks przestrzenny.
Reguła komórek na obiekt
Ta reguła wymusza limit komórek na obiekt, który określa maksymalną liczbę komórek, które mogą być zliczane dla każdego obiektu, z wyjątkiem poziomu 1. Na niższych poziomach reguła komórek na obiekt kontroluje ilość informacji, które mogą być rejestrowane na temat obiektu.
Reguła najgłębszej komórki
Reguła najgłębszej komórki generuje najlepsze przybliżenie obiektu, rejestrując tylko najniższe komórki, które zostały podzielone na mozaikę dla obiektu. Komórki nadrzędne nie przyczyniają się do liczby komórek przypadających na obiekt i nie są zapisywane w indeksie.
Te reguły tessellacji są stosowane rekursywnie na każdym poziomie siatki. W pozostałej części tej sekcji bardziej szczegółowo opisano zasady tessellacji.
Reguła obejmująca
Jeśli obiekt całkowicie obejmuje komórkę, mówi się, że komórka jest objęta obiektem. Na przykład na poniższej ilustracji jedna z komórek drugiego poziomu, 15,11, jest całkowicie pokryta środkową częścią oktagonu.
Komórka objęta jest liczona i rejestrowana w indeksie, a nie jest dzielona na mniejsze elementy.
Komórki — regułaPer-Object
Zakres tessellacji każdego obiektu zależy przede wszystkim od limitu komórek na obiekt indeksu przestrzennego. To ograniczenie definiuje maksymalną liczbę komórek, które tessellation może liczyć na jeden obiekt. Należy jednak pamiętać, że reguła komórek na obiekt nie jest wymuszana dla poziomu 1, więc możliwe jest przekroczenie tego limitu. Jeśli licznik poziomu 1 osiągnie lub przekroczy limit komórek na obiekt, żaden dalszy podział na segmenty nie zachodzi na niższych poziomach.
Tak długo, jak liczba jest mniejsza niż limit komórek na obiekt, proces tessellacji trwa. Począwszy od komórki o najniższej dotykanej liczbie (na przykład komórki 15.6 na wcześniejszej ilustracji), proces testuje każdą komórkę, aby ocenić, czy ją uwzględnić w obliczeniach, czy zrobić tesselację. Jeśli mozaikowanie komórki przekroczyłoby limit komórek na obiekt, komórka jest liczona, a nie mozaikowana. W przeciwnym razie komórka jest podzielona na mniejsze części, a komórki niższego poziomu, które stykają się z obiektem, są liczone. Proces tessellacji trwa w ten sposób, na szerokość, przez cały poziom. Proces ten jest powtarzany rekursywnie dla sieci komórek na niższym poziomie tesselowanych, aż do osiągnięcia limitu lub gdy nie ma więcej komórek do zliczenia.
Rozważmy na przykład poprzednią ilustrację, która pokazuje oktagon, który pasuje całkowicie do komórki 15 siatki poziom-1. Na rysunku komórka 15 została podzielona na drobniejsze części, dzieląc ośmiokąt na dziewięć komórek poziomu-2. Na tej ilustracji przyjęto założenie, że limit komórek na obiekt wynosi co najmniej 9. Gdyby limit komórek na obiekt wynosił 8 lub mniej, komórka 15 nie byłaby teselowana i tylko komórka 15 zostałaby zliczona dla obiektu.
Domyślnie limit komórek na obiekt wynosi 16 komórek na obiekt, co zapewnia zadowalający kompromis między przestrzenią a dokładnością dla większości indeksów przestrzennych. Jednak instrukcja CREATE SPATIAL INDEXTransact-SQL obsługuje klauzulę CELLS_PER_OBJECT =n , która umożliwia określenie limitu komórek na obiekt z zakresu od 1 do 8192 włącznie.
Note
Ustawienie cells_per_object jest widoczne w widoku wykazu indeksu przestrzennego sys.spatial_index_tessellations.
reguła Deepest-Cell
Najgłębsza reguła komórki wykorzystuje fakt, że każda komórka niższego poziomu należy do komórki powyżej niej: komórka poziomu 4 należy do komórki poziomu 3, komórka poziomu 3 należy do komórki poziomu 2, a komórka poziomu 2 należy do komórki poziomu 1. Na przykład obiekt należący do komórki 1.1.1.1 również należy do komórki 1.1.1, komórki 1.1 i komórki 1. Znajomość takich relacji hierarchii komórek jest wbudowana w procesor zapytań. W związku z tym w indeksie należy rejestrować tylko komórki na najgłębszym poziomie, minimalizując informacje, które indeks musi przechowywać.
Na poniższej ilustracji stosunkowo mały wielokąt diamentowy jest wyłożony. Indeks używa domyślnego limitu komórek na obiekt 16, który nie jest osiągany dla tego małego obiektu. W związku z tym teselacja jest kontynuowana do poziomu 4. Wielokąt znajduje się w następujących komórkach na poziomach od 1 do 3: 4, 4.4 oraz 4.4.10 i 4.4.14. Jednak przy użyciu reguły najgłębszej komórki tessellation liczy tylko dwanaście komórek poziomu 4: 4.4.10.13-15 i 4.4.14.14.1-3, 4.4.14.5-7 i 4.4.14.9-11.
Schematy tesselacji
Zachowanie indeksu przestrzennego zależy częściowo od schematu tessellacji. Schemat tessellacji jest specyficzny dla typu danych. W programie SQL Server indeksy przestrzenne obsługują dwa schematy tessellacji:
Teselacja siatki geometrycznej, czyli schemat typu danych geometry.
Teselacja siatki geograficznej, która ma zastosowanie do kolumn typu danych geografii.
Note
Ustawienie tessellation_scheme indeksu przestrzennego jest widoczne w widoku wykazu sys.spatial_index_tessellations.
Schemat tessellacji siatki geometrycznej
GEOMETRY_AUTO_GRID tessellation to domyślny schemat tessellacji dla typu danych geometry dla serwera SQL Server 2012 (11.x) i nowsze wersje. GEOMETRY_GRID tessellation jest jedynym schematem tessellacji dostępnym dla typów danych geometrycznych w programie SQL Server 2008 (10.0.x). W tej sekcji omówiono aspekty tessellacji siatki geometrycznej, które mają zastosowanie do pracy z indeksami przestrzennymi: obsługiwane metody i pola ograniczenia.
Note
Ten schemat tessellacji można jawnie określić przy użyciu klauzuli USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) instrukcji CREATE SPATIAL INDEX Transact-SQL.
Ramka ograniczająca
Dane geometryczne zajmują płaszczyznę, która może być nieskończona. Jednak w programie SQL Server indeks przestrzenny wymaga skończonego miejsca. Aby ustalić skończoną przestrzeń do dekompozycji, schemat tessellacji siatki geometrycznej wymaga prostokątnego pola ograniczenia. Pole ograniczenia jest definiowane przez cztery współrzędne (x-min,y-min) i (x-max,y-max), które są przechowywane jako właściwości indeksu przestrzennego. Te współrzędne reprezentują następujące elementy:
x-min to współrzędna x lewego dolnego rogu prostokąta ograniczającego.
y-min jest współrzędną y lewego dolnego rogu.
x-max to współrzędna x prawego górnego rogu.
y-max jest współrzędną y prawego górnego rogu.
Note
Te współrzędne są określane przez klauzulę BOUNDING_BOX instrukcji CREATE SPATIAL INDEXTransact-SQL.
Współrzędne (x-min,y-min) i (x-max,y-max) określają położenie i wymiary pola ograniczenia. Przestrzeń poza ramką ograniczającą jest traktowana jako pojedyncza komórka, która jest numerowana 0.
Indeks przestrzenny rozkłada przestrzeń wewnątrz pola ograniczenia. Siatka poziomu 1 w hierarchii siatki wypełnia ramkę ograniczającą. Aby umieścić obiekt geometryczny w hierarchii siatki, indeks przestrzenny porównuje współrzędne obiektu ze współrzędnymi pola ograniczenia.
Na poniższej ilustracji przedstawiono punkty zdefiniowane przez współrzędne (x-min,y-min) i (x-max,y-max) ramki ograniczającej. Najwyższy poziom hierarchii siatki jest wyświetlany jako siatka 4x4. Na potrzeby ilustracji pomijane są niższe poziomy. Przestrzeń poza ramką ograniczającą jest oznaczona zerem (0). Należy pamiętać, że obiekt "A" wykracza częściowo poza pole, a obiekt "B" leży całkowicie poza polem w komórce 0.
Pole ograniczenia odpowiada części danych przestrzennych aplikacji. To, czy pole ograniczenia indeksu całkowicie zawiera dane przechowywane w kolumnie przestrzennej, czy tylko częściowo, należy do decyzji aplikacji. Tylko operacje obliczane na obiektach, które znajdują się całkowicie wewnątrz ramki ograniczającej, korzystają z indeksu przestrzennego. W związku z tym aby uzyskać największą zaletę indeksu przestrzennego w kolumnie geometrycznej , należy określić pole ograniczenia zawierające wszystkie lub większość obiektów.
Note
Gęstości siatki indeksu przestrzennego są widoczne w kolumnach bounding_box_xmin, bounding_box_ymin, bounding_box_xmax i bounding_box_ymax w widoku katalogu sys.spatial_index_tessellations.
Schemat tessellacji siatki geograficznej
Ten schemat tessellacji dotyczy tylko kolumny geograficznej . W tej sekcji podsumowano metody wspierane przez tesselację siatki geograficznej i omówiono, jak przestrzeń geodezyjna jest rzutowana na płaszczyznę, a następnie rozkładana na hierarchię siatki.
Note
Można jawnie określić ten schemat tessellacji przy użyciu klauzuli USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) instrukcji CREATE SPATIAL INDEXTransact-SQL.
Projekcja przestrzeni geodezyjnej na płaszczyznę
Obliczenia na instancjach geograficznych (obiektach) traktują przestrzeń zawierającą obiekty jako elipsoidę geodezyjną. Aby rozłożyć tę przestrzeń, schemat tessellacji siatki geograficznej dzieli powierzchnię wielokropka na półkule górne i dolne, a następnie wykonuje następujące kroki:
Rzutuje każdą półkulę na ściany ostrosłupa czworokątnego.
Spłaszcza dwie piramidy.
Łączy spłaszczone piramidy, aby utworzyć nieeuklidesową płaszczyznę.
Na poniższej ilustracji przedstawiono schematowy widok procesu dekompozycji trzyetapowej. W piramidach kropkowane linie reprezentują granice czterech aspektów każdej piramidy. Kroki 1 i 2 ilustrują wielokropek geodetyczny, używając zielonej linii poziomej do reprezentowania linii szerokości geograficznej równikowej i serii zielonych linii pionowych reprezentujących kilka linii długości geograficznej. Krok 1 przedstawia piramidy rzutowane na obu półkulach. Krok 2 pokazuje, że piramidy są spłaszczane. Krok 3 ilustruje spłaszczone piramidy, które po zostały połączone w celu utworzenia płaszczyzny, pokazując liczbę projekcyjnych linii długości geograficznej. Zwróć uwagę, że te linie rzutowane są wyprostowane i różnią się długością w zależności od tego, gdzie nakładają się na piramidy.
Po projekcji przestrzeni na płaszczyznę, płaszczyzna jest zdekomponowana na hierarchię siatki czteropoziomowej. Różne poziomy mogą używać różnych gęstości siatki. Poniższa ilustracja przedstawia płaszczyznę po jej rozłożeniu na siatkę poziomu 1 o układzie 4x4. Na potrzeby ilustracji pomijane są niższe poziomy hierarchii siatki. W rzeczywistości płaszczyzna jest w pełni rozłożona na czteropoziomową hierarchię siatki. Po zakończeniu procesu dekompozycji dane geograficzne są odczytywane, wiersz po wierszu, z kolumny geograficznej, a proces tessellacji jest wykonywany dla każdego obiektu po kolei.
Metody obsługiwane przez indeksy przestrzenne
Metody geometryczne obsługiwane przez indeksy przestrzenne
Indeksy przestrzenne obsługują następujące metody geometrii zorientowane na zestaw w określonych warunkach: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() i STWithin(). Aby być obsługiwane przez indeks przestrzenny, te metody muszą być używane w klauzuli WHERE lub JOIN ON zapytania i muszą występować w predykacie następującej ogólnej formy:
geometry1. method_name(geometry2)comparison_operator**valid_number
Aby zwrócić wynik inny niż null, geometria1 i geometria2 muszą mieć ten sam identyfikator odwołania przestrzennego (SRID). W przeciwnym razie metoda zwraca wartość NULL.
Indeksy przestrzenne obsługują następujące formularze predykatu:
geometry1. STContains(geometry2) = 1
geometry1. StDistance(geometry2) <— liczba
geometry1. STDistance(geometry2) <= liczba
geometry1. STEquals(geometry2)= 1
geometry1. STIntersects(geometry2)= 1
geometry1.STOverlaps(geometry2) = 1
geometry1. STTouches(geometry2) = 1
geometry1. STWithin(geometry2)= 1
Metody geografii obsługiwane przez indeksy przestrzenne
W pewnych warunkach indeksy przestrzenne obsługują następujące metody geografii zorientowane na zestaw: STIntersects(),STEquals() i STDistance(). Aby być obsługiwane przez indeks przestrzenny, te metody muszą być używane w klauzuli WHERE zapytania i muszą występować w predykacie następującej ogólnej formy:
geography1. method_name(geography2)comparison_operator**valid_number
Aby zwrócić wynik inny niż null, geografia1 i geografia2 muszą mieć ten sam identyfikator odwołania przestrzennego (SRID). W przeciwnym razie metoda zwraca wartość NULL.
Indeksy przestrzenne obsługują następujące formularze predykatu:
geography1. STIntersects(geography2)= 1
geography1. STEquals(geography2)= 1
geography1.STDistance(geography2)<liczba
geography1. STDistance(geography2) <= liczba
Zapytania korzystające z indeksów przestrzennych
Indeksy przestrzenne są obsługiwane tylko w zapytaniach, które zawierają indeksowany operator przestrzenny w klauzuli WHERE . Na przykład składnia, taka jak:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Optymalizator zapytań rozumie przemienność operacji przestrzennych (czyli @a.STIntersects(@b) = @b.STIntersects(@a) ). Jednak indeks przestrzenny nie będzie używany, jeśli początek porównania nie zawiera operatora przestrzennego (na przykład WHERE 1 = spatial op nie będzie używać indeksu przestrzennego). Aby użyć indeksu przestrzennego, zapisz ponownie porównanie (na przykład WHERE spatial op = 1).
Podobnie jak w przypadku każdego innego indeksu, gdy indeks przestrzenny jest obsługiwany, użycie indeksu przestrzennego jest wybierane na podstawie kosztów, więc optymalizator zapytań może nie zdecydować się na użycie indeksu przestrzennego, mimo że są spełnione wszystkie wymagania dotyczące korzystania z niego. Użyj showplanu, aby sprawdzić, czy indeks przestrzenny został użyty, a w razie potrzeby podaj wskazówki dotyczące zapytań, aby wymusić żądany plan zapytania.
Najbliższy typ zapytania sąsiada obsługuje również indeksy przestrzenne tylko wtedy, gdy jest napisana określona składnia zapytania. Odpowiednią składnią jest:
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) [;]