Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di Azure SQL
Database SQL in Microsoft Fabric
SQL Server supporta dati spaziali e indici spaziali. Un indice spaziale è un tipo di indice esteso che consente di indicizzare una colonna spaziale. Una colonna spaziale è una colonna della tabella che contiene dati spaziali, ad esempio geometry o geography.
Tip
Gli strumenti spaziali di SQL Server sono una raccolta di strumenti open source sponsorizzata da Microsoft da usare con i tipi spaziali in SQL Server. Questo progetto fornisce una serie di funzioni riutilizzabili che possono essere usate dalle applicazioni. Queste funzioni possono includere routine di conversione di dati, nuove trasformazioni, aggregazioni e così via. Per altri dettagli, vedere Microsoft/SQLServerSpatialTools su GitHub.
Informazioni sugli indici spaziali
Scomposizione dello spazio indicizzato in una gerarchia di griglie
In SQL Server gli indici spaziali vengono compilati con alberi B, pertanto gli indici devono rappresentare i dati spaziali bidimensionali nell'ordine lineare degli alberi B. Pertanto, prima della lettura di dati in un indice spaziale, SQL Server consente di implementare una scomposizione gerarchica uniforme dello spazio. Il processo di creazione dell'indice scompone lo spazio in una gerarchia di grigliea quattro livelli. Questi livelli vengono indicati come livello 1 (il livello principale), livello 2, livello 3e livello 4.
Ogni livello successivo scompone ulteriormente il livello precedente, pertanto ogni cella di livello superiore contiene una griglia completa al livello successivo. Su un livello specificato, tutte le griglie hanno lo stesso numero di celle lungo entrambi gli assi (ad esempio, 4x4 o 8x8) e le celle hanno tutte la stessa dimensione.
L'illustrazione seguente mostra la scomposizione della cella in alto a destra, a ciascun livello della gerarchia della griglia, in una griglia 4x4. In realtà, tutte le celle vengono scomposte in questo modo. Quindi, ad esempio, scomponendo uno spazio in quattro livelli di griglie 4x4 si produce un totale di 65.536 celle a quattro livelli.
Note
La scomposizione dello spazio per un indice spaziale è indipendente dall'unità di misura utilizzata dai dati dell'applicazione.
Le celle di una gerarchia di griglie sono numerate in modo lineare tramite una variazione della curva di riempimento dello spazio di Hilbert. Tuttavia, a scopo illustrativo, viene utilizzata una semplice numerazione per riga, invece della numerazione effettivamente prodotta dalla curva di Hilbert. Nell'illustrazione seguente molti poligoni che rappresentano edifici e linee che rappresentano strade sono già stati posizionati in una griglia 4x4 di livello 1. Le celle di 1 livello sono numerate da 1 a 16 partendo dalla cella in alto a sinistra.
Densità griglia
Il numero di celle lungo gli assi di una griglia ne determina densità. Maggiore è il numero di celle, più densa è la griglia. Ad esempio, una griglia 8x8 (che crea 64 celle) è più densa di una griglia 4x4 (che crea 16 celle). La densità della griglia è definita per ogni livello.
L'istruzione CREATE SPATIAL INDEXTransact-SQL supporta una clausola GRIDS che consente di specificare densità di griglia diverse a livelli diversi. La densità della griglia per un determinato livello viene specificata utilizzando una delle parole chiave seguenti.
| Keyword | Configurazione della griglia | Numero di celle |
|---|---|---|
| LOW | 4X4 | 16 |
| MEDIUM | 8X8 | 64 |
| HIGH | 16X16 | 256 |
In SQL Server, quando il livello di compatibilità del database è impostato su un valore uguale o inferiore a 100, per tutti i livelli l'impostazione predefinita sarà MEDIUM. Quando il livello di compatibilità del database è impostato su 110 o su un valore superiore, l'impostazione predefinita è uno schema a griglia automatica. (La griglia automatica indica una configurazione a 8 livelli di HLLLLLLL.) Invece di variare la densità della griglia di indice, è possibile modificare le celle per oggetto e le celle della finestra di query per oggetto mediante hint.
È possibile controllare il processo di scomposizione specificando densità della griglia non predefinite. Diverse densità della griglia a livelli diversi, ad esempio, potrebbero essere utili per l'ottimizzazione di un indice in base alle dimensioni dello spazio indicizzato e agli oggetti nella colonna spaziale.
Note
Le densità della griglia di un indice spaziale sono visibili nelle colonne level_1_grid, level_2_grid, level_3_grid e level_4_grid della vista del catalogo sys.spatial_index_tessellations quando il livello di compatibilità del database è impostato su 100 o su un valore inferiore. Le opzioni dello schema di tassellazione GEOMETRY_AUTO_GRID/GEOGRAPHY_AUTO_GRID non compilano queste colonne. La vista del catalogo sys.spatial_index_tessellations ha valori NULL per queste colonne quando si usano le opzioni della griglia automatiche.
Tessellation
Dopo la scomposizione di uno spazio indicizzato in una gerarchia di griglie, l'indice spaziale legge i dati dalla colonna spaziale, riga per riga. Dopo aver letto i dati di un oggetto spaziale (o istanza), l'indice spaziale esegue un processo di tassellazione per tale oggetto. Il processo di tassellazione inserisce l'oggetto nella gerarchia della griglia associandolo a un insieme di celle della griglia che esso tocca (celle toccate). Partendo dal livello 1 della gerarchia della griglia, il processo di tassellazione procede in ampiezza all’interno del livello. Potenzialmente, il processo può continuare per tutti i quattro livelli, uno dopo l'altro.
Il risultato del processo di tassellazione è un insieme di celle coinvolte che vengono registrate nell'indice spaziale dell'oggetto. Riferendosi a queste celle registrate, l'indice spaziale può trovare l'oggetto nello spazio in relazione ad altri oggetti nella colonna spaziale che sono archiviati anche nell'indice.
Regole di tassellatura
Per limitare il numero di celle coinvolte che vengono registrate per un oggetto, il processo di tassellazione applica diverse regole di tassellazione. Queste regole determinano la profondità del processo di tassellazione e quali delle celle interessate vengono registrate nell'indice.
Le regole sono le seguenti:
La regola di ricoprimento
Se l'oggetto copre completamente una cella, tale cella viene definita coperta dall'oggetto. Una cella coperta viene conteggiata e non viene tassellata. Questa regola è valida per tutti i livelli della gerarchia di griglie. La regola di copertura semplifica il processo di tassellazione e riduce la quantità di dati registrati da un indice spaziale.
Regola delle celle per oggetto
Questa regola stabilisce il limite di celle per oggettoe determina il numero massimo di celle che possono essere conteggiate per ogni oggetto, a eccezione del livello 1. A livelli inferiori, la regola delle celle per oggetto consente di controllare la quantità di informazioni che possono essere registrate sull'oggetto.
Regola della cella più profonda
La regola della cella più profonda genera la migliore approssimazione di un oggetto registrando solo le celle più profonde che sono state tassellate per l'oggetto. Le celle padre non contribuiscono al conteggio delle celle per oggetto e non sono registrate nell'indice.
Queste regole di tassellazione vengono applicate ricorsivamente su ogni livello della griglia. Nel resto di questa sezione vengono descritte in modo più dettagliato le regole di tassellazione.
Regola di copertura
Se un oggetto copre completamente una cella, quella cella viene definita coperta dall'oggetto. Ad esempio, nell'illustrazione seguente, una delle celle di secondo livello, 15.11, è completamente coperta dalla parte centrale di un ottagono.
Una cella coperta viene conteggiata e registrata nell'indice, e la cella non viene ulteriormente suddivisa in tessere.
Regola celle-per-oggetto
Il grado di tassellazione di ogni oggetto dipende principalmente dal limite di celle per oggetto dell'indice spaziale. Questo limite definisce il numero massimo di celle che la tassellazione può contare per ogni oggetto. Tuttavia la regola delle celle per oggetto non viene applicata per il livello 1, pertanto è possibile superare questo limite. Se il conteggio del livello-1 raggiunge o supera il limite di celle per oggetto, non si verifica alcuna ulteriore tassellazione ai livelli inferiori.
Finché il numero è inferiore al limite di celle per oggetto, il processo di tassellazione continua. Partendo dalla cella toccata con il numero più basso (ad esempio, la cella 15.6 nell'illustrazione precedente), il processo verifica ciascuna cella per stabilire se contarla o tassellarla. Se la tassellazione di una cella supererebbe il limite di celle per oggetto, la cella viene conteggiata e non viene tassellata. In caso contrario, la cella viene tassellata e le celle di livello inferiore toccate dall'oggetto vengono conteggiate. Il processo di tassellazione continua in questo modo, in larghezza, lungo tutto il livello. Questo processo viene ripetuto ricorsivamente per le griglie di livello inferiore delle celle tassellate fino al raggiungimento del limite oppure finché non ci sono più celle da contare.
Ad esempio, nell'illustrazione precedente viene mostrato un ottagono che si inserisce perfettamente nella cella 15 della griglia di livello 1. Nella figura, la cella 15 è stata tassellata, suddividendo l'ottagono in nove celle di livello-2. In questa illustrazione si presuppone che il limite di celle per oggetto sia 9 o più. Se tuttavia il limite di celle per oggetto è pari o inferiore a 8, la cella 15 non viene suddivisa e viene conteggiata da sola per l'oggetto.
Per impostazione predefinita il limite di celle per oggetto è pari a 16, una soluzione intermedia soddisfacente tra spazio e precisione per la maggior parte di indici spaziali. Tuttavia, l'istruzione CREATE SPATIAL INDEXTransact-SQL supporta una clausola CELLS_PER_OBJECT =n che consente di specificare un limite di celle per oggetto compreso tra 1 e 8192 inclusi.
Note
L'impostazione cells_per_object di un indice spaziale è visibile nella vista del catalogo sys.spatial_index_tessellations .
Regola della cella più profonda
La regola della cella più in basso sfrutta il fatto che ogni cella di livello inferiore appartiene alla cella a essa superiore: una cella di livello 4 appartiene a una cella di livello 3, una cella di livello 3 appartiene a una cella di livello 2 e una cella di livello 2 appartiene a una cella di livello 1. Un oggetto che appartiene alla cella 1.1.1.1, ad esempio, appartiene anche alle celle 1.1.1, 1.1 e 1. Il riconoscimento di tali relazioni gerarchiche tra celle è incorporata in Query Processor. Pertanto, solo le celle di livello più basso devono essere registrate nell'indice, rendendo minime le informazioni da archiviare.
Nell'illustrazione seguente, un poligono relativamente piccolo a forma di rombo è tassellato. L'indice utilizza il limite di celle per oggetto predefinito di 16 che non è raggiunto per questo piccolo oggetto. La tassellazione, pertanto, continua fino al livello 4. Il poligono si trova nelle celle comprese tra il livello 1 e il livello 3 seguenti: 4, 4.4 e 4.4.10 e 4.4.14. Tuttavia, utilizzando la regola della cella più profonda, la tassellazione conta solo le dodici celle di livello 4: 4.4.10.13-15 e 4.4.14.1-3, 4.4.14.5-7, e 4.4.14.9-11.
Schemi di tassellatura
Il comportamento di un indice spaziale dipende parzialmente dal relativo schema a mosaico. Lo schema di tassellazione è specifico del tipo di dati. In SQL Server, gli indici spaziali supportano due schemi di tassellazione:
Tassellazione della griglia di geometria, che è lo schema per il tipo di dati geometry.
Tassellazione della griglia geografica, che si applica alle colonne del tipo di dati geografia.
Note
L'impostazione tessellation_scheme di un indice spaziale è visibile nella vista del catalogo sys.spatial_index_tessellations .
Schema di tassellazione della griglia geometrica
GEOMETRY_AUTO_GRID è lo schema di tassellazione predefinito per il tipo di dati geometry in SQL Server 2012 (11.x) e versioni successive. GEOMETRY_GRID è l'unico schema di tassellazione disponibile per i tipi di dati geometry in SQL Server 2008 (10.0.x). Questa sezione illustra alcuni aspetti della tassellazione della griglia geometrica rilevanti per l'uso degli indici spaziali: i metodi supportati e i riquadri di delimitazione.
Note
È possibile specificare esplicitamente questo schema di tassellazione utilizzando la clausola USING (GEOMETRY_AUTO_GRID/GEOMETRY_GRID) dell'istruzione Transact-SQL CREATE SPATIAL INDEX.
Il riquadro di delimitazione
I dati geometrici occupano un piano che può essere infinito. In SQL Server, tuttavia, un indice spaziale richiede uno spazio finito. Per stabilire uno spazio finito per la scomposizione, lo schema di tassellazione della griglia geometrica richiede un box di delimitazione rettangolare. Il riquadro di delimitazione è definito da quattro coordinate, (x-min,y-min) e (x-max,y-max), che sono memorizzate come proprietà dell'indice spaziale. Queste coordinate rappresentano gli elementi seguenti:
x-min è la coordinata x dell'angolo inferiore sinistro del riquadro di delimitazione.
y-min è la coordinata y dell'angolo inferiore sinistro.
x-max è la coordinata x dell'angolo superiore destro.
y-max è la coordinata y dell'angolo superiore destro.
Note
Queste coordinate vengono specificate dalla clausola BOUNDING_BOX dell'istruzione CREATE SPATIAL INDEXTransact-SQL.
Le coordinate (x-min,y-min) e (x-max,y-max) determinano la posizione e le dimensioni del riquadro di delimitazione. Lo spazio al di fuori del riquadro di delimitazione è considerato come un'unica cella contrassegnata dal numero 0.
L'indice spaziale scompone lo spazio all'interno del riquadro di delimitazione. La griglia di livello 1 della gerarchia della griglia riempie il riquadro di delimitazione. Per posizionare un oggetto geometrico nella gerarchia della griglia, l'indice spaziale confronta le coordinate dell'oggetto con le coordinate del riquadro di delimitazione.
La figura seguente mostra i punti definiti dalle coordinate (x-min,y-min) e (x-max,y-max) del riquadro di delimitazione. Il livello superiore della gerarchia di griglie viene mostrato come una griglia 4x4. Ai fini dell'illustrazione, i livelli inferiori sono omessi. Lo spazio esterno al riquadro di delimitazione è indicato da uno zero (0). L'oggetto 'A' si estende in parte oltre il riquadro e l'oggetto 'B' si trova completamente al di fuori del riquadro nella cella 0.
Un riquadro di delimitazione corrisponde a una porzione dei dati spaziali di un'applicazione. In base all'applicazione, il riquadro dell'indice può contenere tutti o solo una parte dei dati archiviati nella colonna spaziale. Solo le operazioni eseguite su oggetti che si trovano interamente all'interno del riquadro di delimitazione traggono vantaggio dall'indice spaziale. Pertanto, per trarre il massimo vantaggio da un indice spaziale su una colonna geometry, è necessario specificare un rettangolo delimitatore che contenga tutti o la maggior parte degli oggetti.
Note
Le densità della griglia di un indice spaziale sono visibili nelle colonne bounding_box_xmin, bounding_box_ymin, bounding_box_xmax e bounding_box_ymax della vista del catalogo sys.spatial_index_tessellations.
Lo schema di tassellazione della griglia geografica
Questo schema di tassellazione si applica solo a una colonna di tipo geography. In questa sezione vengono riepilogati i metodi supportati dalla tassellazione della griglia geografica e viene illustrato il modo in cui lo spazio geodetico viene proiettato su un piano, che viene poi scomposto in una gerarchia di griglie.
Note
È possibile specificare esplicitamente questo schema di tassellatura tramite la clausola USING (GEOGRAPHY_AUTO_GRID/GEOGRAPHY_GRID) dell'istruzione CREATE SPATIAL INDEXTransact-SQL.
Proiezione dello spazio geodetico su un piano
I calcoli sulle istanze (oggetti) geography considerano lo spazio che contiene gli oggetti come un ellissoide geodetico. Per scomporre questo spazio lo schema a mosaico della griglia di geografia divide la superficie dell'ellissoide negli emisferi superiori e inferiori e quindi esegue i passaggi seguenti:
Proietta ciascun emisfero sulle facce di una piramide quadrangolare.
Appiattisce le due piramidi.
Unione delle piramidi piatte per formare un piano non euclideo.
Nell'illustrazione seguente viene mostrata una vista schematica del processo di scomposizione a tre passaggi. Nelle piramidi, le linee punteggiate rappresentano i limiti dei quattro facet di ogni piramide. I passaggi 1 e 2 illustrano l'ellissoide geodetico, usando una linea verde orizzontale per rappresentare la linea della latitudine equatoriale e una serie di linee verdi verticali per rappresentare diverse linee della longitudine. Il passaggio 1 mostra le piramidi proiettate sui due emisferi. Il passaggio 2 mostra le piramidi mentre vengono appiattite. Il passaggio 3 illustra le piramidi appiattite, dopo essere state combinate a formare un piano, e mostra un certo numero di linee di longitudine proiettate. Queste linee proiettate sono dritte e di lunghezza diversa, a seconda di dove cadono sulle piramidi.
Una volta che lo spazio è stato proiettato sul piano, questo viene scomposto in una gerarchia di griglie a quattro livelli. Livelli diversi possono utilizzare densità della griglia differenti. L'illustrazione seguente mostra il piano dopo essere stato suddiviso in una griglia 4x4 di livello 1. Ai fini dell'illustrazione, i livelli inferiori della gerarchia di griglie sono omessi. In effetti, il piano è completamente scomposto in una gerarchia di griglie a quattro livelli. Al termine del processo di scomposizione, i dati geografici vengono letti, riga per riga, dalla colonna geography e il processo di tassellazione viene eseguito, a turno, per ciascun oggetto.
Metodi supportati dagli indici spaziali
Metodi di geometria supportati da indici spaziali
Gli indici spaziali supportano i seguenti metodi di geometry orientati agli insiemi in determinate condizioni: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() e STWithin(). Per essere supportati da un indice spaziale questi metodi devono essere utilizzati all'interno della clausola WHERE o JOIN ON di una query e devono verificarsi all'interno di un predicato del seguente form generale:
geometry1.method_name(geometry2)comparison_operator**valid_number
Per ottenere un risultato non Null, geometry1 e geometry2 devono avere lo stesso identificatore SRID (Spatial Reference Identifier). In caso contrario, il metodo restituisce NULL.
Gli indici spaziali supportano i seguenti form di predicato:
geometry1. STContains(geometry2) = 1
geometry1.STDistance(geometry2) <numero
geometry1.STDistance(geometry2) <= numero
geometry1. STEquals(geometry2)= 1
geometry1. STIntersects(geometry2)= 1
geometry1.STOverlaps(geometry2) = 1
geometry1. STTouches(geometry2) = 1
geometry1. STWithin(geometry2)= 1
Metodi di geografia supportati da indici spaziali
In alcuni casi, gli indici spaziali supportano i metodi geography orientati ai set seguenti: STIntersects(),STEquals() e STDistance(). Per essere supportati da un indice spaziale questi metodi devono essere utilizzati all'interno della clausola WHERE di una query e devono verificarsi all'interno di un predicato del seguente form generale:
geography1.method_name(geography2)comparison_operator**valid_number
Per ottenere un risultato non Null, geography1 e geography2 devono avere lo stesso identificatore SRID (Spatial Reference Identifier). In caso contrario, il metodo restituisce NULL.
Gli indici spaziali supportano i seguenti form di predicato:
geography1. STIntersects(geography2)= 1
geography1. STEquals(geography2)= 1
geography1.STDistance(geography2) <numero
geography1.STDistance(geography2) <= numero
Query con indici spaziali
Gli indici spaziali sono supportati solo nelle query che includono un operatore spaziale indicizzato nella clausola WHERE . Ad esempio, la sintassi seguente:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Query Optimizer riconosce la commutatività di operazioni spaziali ( @a.STIntersects(@b) = @b.STIntersects(@a) ). Tuttavia, l'indice spaziale non verrà utilizzato se l'inizio di un confronto non contiene l'operatore spaziale (ad esempio WHERE 1 = spatial op non utilizzerà l'indice spaziale). Per utilizzare l'indice spaziale, riscrivere il confronto (ad esempio WHERE spatial op = 1).
Analogamente a qualsiasi altro indice, quando è supportato un indice spaziale, l'utilizzo di quest'ultimo viene scelto in base al costo, pertanto tramite Query Optimizer non è possibile scegliere di utilizzare l'indice spaziale anche se vengono soddisfatti tutti i requisiti per utilizzarlo. Utilizzare showplan per verificare se l'indice spaziale è stato usato e, se necessario, fornire hint di query per imporre il piano di query desiderato.
Il tipo adiacente più prossimo di query supporta anche gli indici spaziali, tuttavia solo se viene scritta una sintassi di query specifica. La sintassi appropriata è:
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) [;]