CREATE SPATIAL INDEX (Transact-SQL)
Crea un indice spaziale in una tabella e in una colonna specificate. L'indice può essere creato prima dell'immissione dei dati nella tabella. È possibile creare indici per tabelle o viste di un altro database specificando un nome di database completo.
Nota
Per informazioni sugli indici spaziali, vedere Panoramica dell'indicizzazione spaziale.
Sintassi
Create Spatial Index
CREATE SPATIAL INDEX index_name
ON <object> ( spatial_column_name )
{
[ USING <geometry_grid_tessellation> ]
WITH ( <bounding_box>
[ [,] <tesselation_parameters> [ ,...n ] ]
[ [,] <spatial_index_option> [ ,...n ] ] )
| [ USING <geography_grid_tessellation> ]
[ WITH ( [ <tesselation_parameters> [ ,...n ] ]
[ [,] <spatial_index_option> [ ,...n ] ] ) ]
}
[ ON { filegroup_name | "default" } ]
;
<object> ::=
[ database_name. [ schema_name ] . | schema_name. ]
table_name
<geometry_grid_tessellation> ::=
{ GEOMETRY_GRID }
<bounding_box> ::=
BOUNDING_BOX = ( {
xmin, ymin, xmax, ymax
| <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate>
} )
<named_bb_coordinate> ::= { XMIN = xmin | YMIN = ymin | XMAX = xmax | YMAX=ymax }
<tesselation_parameters> ::=
{
GRIDS = ( { <grid_density> [ ,...n ] | <density>, <density>, <density>, <density> } )
| CELLS_PER_OBJECT = n
}
<grid_density> ::=
{
LEVEL_1 = <density>
| LEVEL_2 = <density>
| LEVEL_3 = <density>
| LEVEL_4 = <density>
}
<density> ::= { LOW | MEDIUM | HIGH }
<geography_grid_tessellation> ::=
{ GEOGRAPHY_GRID }
<spatial_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = OFF
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = OFF
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
}
Argomenti
index_name
Nome dell'indice. I nomi di indice devono essere univoci all'interno di una tabella, ma non all'interno di un database. Inoltre, devono essere conformi alle regole per gli identificatori.ON <object> ( spatial_column_name )
Specifica l'oggetto (database, schema o tabella) in cui deve essere creato l'indice e il nome di una colonna spaziale.spatial_column_name specifica la colonna spaziale su cui l'indice è basato. È possibile specificare una sola colonna spaziale in una singola definizione di indice spaziale, ma è possibile creare più indici spaziali in una colonna geometry o geography.
USING
Indica lo schema a mosaico dell'indice spaziale. Questo parametro corrisponde per impostazione predefinita al valore specifico del tipo, come indicato di seguito:Tipo di dati della colonna
Schema a mosaico
geometry
GEOMETRY_GRID
geography
GEOGRAPHY_GRID
È possibile creare un indice spaziale solo in una colonna di tipo geometry o geography. In caso contrario, viene generato un errore. Viene inoltre generato un errore anche se viene passato un parametro non valido per un tipo specifico.
Nota
Per informazioni sull'implementazione del mosaico in SQL Server, vedere Panoramica dell'indicizzazione spaziale.
ON filegroup_name
Crea l'indice specificato nel filegroup specificato. Se non viene specificata una posizione e la tabella non è partizionata, l'indice utilizza lo stesso filegroup della tabella sottostante. Il filegroup deve essere già esistente.ON "default**"**
Crea l'indice specificato nel filegroup predefinito.In questo contesto il termine default non rappresenta una parola chiave, ma un identificatore per il filegroup predefinito e pertanto deve essere delimitato, ad esempio ON "default" oppure ON [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Rappresenta l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).
<object>::=
Oggetto con nome completo o non qualificato che si desidera indicizzare.
database_name
Nome del database.schema_name
Nome dello schema a cui appartiene la tabella.table_name
Nome della tabella da indicizzare.
Opzioni WITH
GEOMETRY_GRID
Specifica lo schema a mosaico per la griglia geometrica in uso. È possibile specificare GEOMETRY_GRID solo in una colonna con tipo di dati geometry. Si tratta dell'impostazione predefinita per questo tipo di dati e non è necessario che venga specificata.GEOGRAPHY_GRID
Specifica lo schema a mosaico per la griglia geografica. È possibile specificare GEOMETRY_GRID solo in una colonna con tipo di dati geography. Si tratta dell'impostazione predefinita per questo tipo di dati e non è necessario che venga specificata.BOUNDING_BOX
Specifica una tupla numerica di quattro elementi che definisce le quattro coordinate del riquadro: le coordinate x-min e y-min dell'angolo inferiore sinistro e le coordinate x-max e y-max dell'angolo superiore destro.xmin
Specifica la coordinata x dell'angolo inferiore sinistro del rettangolo di selezione.ymin
Specifica la coordinata y dell'angolo inferiore sinistro del rettangolo di selezione.xmax
Specifica la coordinata x dell'angolo superiore destro del rettangolo di selezione.ymax
Specifica la coordinata y dell'angolo superiore destro del rettangolo di selezione.XMIN = xmin
Specifica il nome della proprietà e il valore della coordinata x dell'angolo inferiore sinistro del riquadro.YMIN =ymin
Specifica il nome della proprietà e il valore della coordinata y dell'angolo inferiore sinistro del riquadro.XMAX =xmax
Specifica il nome della proprietà e il valore della coordinata x dell'angolo superiore destro del riquadro.YMAX =ymax
Specifica il nome della proprietà e il valore della coordinata y dell'angolo superiore destro del riquadro.
Le coordinate dei riquadri si applicano solo all'interno di una clausola USING GEOMETRY_GRID.
Il valore di xmax deve essere maggiore di quello di xmin e il valore di ymax deve essere maggiore di quello di ymin. È possibile specificare qualsiasi rappresentazione di valore float valida, presupponendo che: xmax >xmin e ymax>ymin. In caso contrario, vengono generati errori.
Non sono previsti valori predefiniti.
Nei nomi di proprietà del riquadro non viene fatta distinzione tra maiuscole e minuscole, indipendentemente dalle regole di confronto del database.
Per specificare i nomi delle proprietà, è necessario specificare ogni nome una sola volta. I nomi possono essere specificati in qualsiasi ordine. Le clausole seguenti sono ad esempio equivalenti:
BOUNDING_BOX = ( XMIN = xmin, YMIN = ymin, XMAX = xmax, YMAX = ymax )
BOUNDING_BOX = ( XMIN = xmin, XMAX = xmax, YMIN = ymin, YMAX = ymax )
GRIDS
Definisce la densità della griglia a ogni livello di uno schema a mosaico.Nota
Per informazioni sul mosaico, vedere Panoramica dell'indicizzazione spaziale.
I parametri di GRID sono i seguenti:
LEVEL_1
Specifica la griglia di primo livello (principale).LEVEL_2
Specifica la griglia di secondo livello.LEVEL_3
Specifica la griglia di terzo livello.LEVEL_4
Specifica la griglia di quarto livello.LOW
Specifica la più bassa densità possibile per la griglia a un determinato livello. LOW equivale a 16 celle (griglia 4x4).MEDIUM
Specifica una densità media per la griglia a un determinato livello. MEDIUM equivale a 64 celle (griglia 8x8).HIGH
Specifica la più alta densità possibile per la griglia a un determinato livello. HIGH equivale a 256 celle (griglia 16x16).
L'utilizzo di nomi per i livelli consente di specificare i livelli in qualsiasi ordine e di omettere determinati livelli. Se si utilizza il nome per un livello, è necessario utilizzarlo anche per qualsiasi altro livello specificato. Se si omette un livello, per la densità viene utilizzato il valore predefinito MEDIUM.
Se si specifica una densità non valida, viene generato un errore.
CELLS_PER_OBJECT =n
Specifica il numero di celle del mosaico per oggetto che può essere utilizzato dal processo a mosaico per un singolo oggetto spaziale nell'indice. n può essere qualsiasi numero intero compreso tra 1 e 8192 inclusi. Il numero predefinito di celle per oggetto è 16. Se viene passato un numero non valido o se il numero è maggiore del numero massimo di celle per il mosaico specificato, viene generato un errore.Se, al livello principale, in un oggetto sono incluse più celle rispetto a quanto specificato dal parametro n, nell'indicizzazione viene utilizzata la quantità di celle necessaria a fornire un mosaico di livello principale completo. In tali casi un oggetto può ricevere un numero di celle maggiore di quello specificato: In questo caso, il numero massimo è il numero di celle generate dalla griglia di livello principale, che dipende dalla densità.
Il valore CELLS_PER_OBJECT viene utilizzato dalla regola di suddivisione a mosaico di celle per oggetto. Per informazioni sulle regole di suddivisione a mosaico, vedere Panoramica dell'indicizzazione spaziale.
PAD_INDEX = { ON | OFF }
Specifica il riempimento dell'indice. Il valore predefinito è OFF.ON
La percentuale di spazio disponibile specificata in fillfactor viene applicata alle pagine di livello intermedio dell'indice.OFF o fillfactor non specificato
Le pagine di livello intermedio vengono riempite poco al di sotto della capacità massima, in modo che lo spazio residuo sia sufficiente per almeno una riga della dimensione massima supportata dall'indice, in base al set di chiavi nelle pagine intermedie.
L'opzione PAD_INDEX risulta utile solo quando si specifica FILLFACTOR, in quanto PAD_INDEX utilizza la percentuale specificata in FILLFACTOR. Se la percentuale specificata in FILLFACTOR non consente l'inserimento di una riga, Motore di database sostituisce internamente tale percentuale in modo da rendere disponibile lo spazio minimo necessario. Il numero di righe di una pagina intermedia dell'indice non è mai minore di due, indipendentemente dal valore di fillfactor.
FILLFACTOR =fillfactor
Specifica una percentuale che indica il livello di riempimento del livello foglia di ogni pagina di indice applicato da Motore di database durante la creazione o la ricompilazione dell'indice. fillfactor deve essere un valore intero compreso tra 1 e 100. Il valore predefinito è 0. Se fillfactor è 100 o 0, tramite Motore di database vengono creati indici con pagine foglia riempite fino alla capacità massima.Nota
I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.
L'impostazione di FILLFACTOR viene applicata solo in fase di creazione o di ricompilazione dell'indice. La percentuale specificata di spazio vuoto delle pagine non viene mantenuta in modo dinamico da Motore di database. Per visualizzare l'impostazione del fattore di riempimento, utilizzare la vista del catalogo sys.indexes.
Importante La creazione di un indice cluster con un valore FILLFACTOR minore di 100 influisce sulla quantità di spazio di archiviazione occupata dai dati perché i dati vengono ridistribuiti da Motore di database durante la creazione dell'indice cluster.
Per ulteriori informazioni, vedere Fattore di riempimento.
SORT_IN_TEMPDB = { ON | OFF }
Specifica se i risultati temporanei dell'ordinamento devono essere archiviati in tempdb. Il valore predefinito è OFF.ON
I risultati intermedi dell'ordinamento utilizzati per la compilazione dell'indice vengono archiviati in tempdb. Questo potrebbe ridurre il tempo necessario per creare un indice se tempdb si trova in un set di dischi diverso rispetto al database utente. La quantità di spazio su disco utilizzata durante la compilazione dell'indice sarà tuttavia maggiore.OFF
I risultati intermedi dell'ordinamento vengono archiviati nello stesso database dell'indice.
Oltre allo spazio necessario nel database utente per la creazione dell'indice, in tempdb deve essere disponibile una quantità di spazio aggiuntivo pressoché equivalente per l'archiviazione dei risultati intermedi dell'ordinamento. Per ulteriori informazioni, vedere tempdb e creazione dell'indice.
IGNORE_DUP_KEY =OFF
Non ha effetto per gli indici spaziali perché il tipo di indice non è mai univoco. Non impostare questa opzione su ON altrimenti viene generato un errore.STATISTICS_NORECOMPUTE = { ON | OFF}
Specifica se le statistiche di distribuzione vengono ricalcolate. Il valore predefinito è OFF.ON
Le statistiche non aggiornate non vengono ricalcolate automaticamente.OFF
Abilita l'aggiornamento automatico delle statistiche.
Per ripristinare l'aggiornamento automatico delle statistiche, impostare l'opzione STATISTICS_NORECOMPUTE su OFF oppure eseguire UPDATE STATISTICS senza la clausola NORECOMPUTE.
Importante La disabilitazione del ricalcolo automatico delle statistiche di distribuzione può compromettere la selezione di piani di esecuzione ottimali per le query riguardanti la tabella in Query Optimizer.
DROP_EXISTING = { ON | OFF }
Specifica che è necessario eliminare e quindi ricompilare l'indice spaziale denominato preesistente. Il valore predefinito è OFF.ON
L'indice esistente viene eliminato e ricompilato. Il nome di indice specificato deve corrispondere a quello dell'indice esistente, mentre la definizione dell'indice può essere modificata. È possibile, ad esempio, specificare valori diversi per le colonne, il tipo di ordinamento, lo schema di partizione o le opzioni dell'indice.OFF
Se il nome di indice specificato esiste già, viene visualizzato un messaggio di errore.
Il tipo di indice non può essere modificato tramite l'opzione DROP_EXISTING.
ONLINE =OFF
Specifica che le tabelle sottostanti e gli indici associati non sono disponibili per le query e la modifica dei dati durante l'operazione sull'indice. In questa versione di SQL Server, le operazioni di compilazione di indici online non sono supportate per gli indici spaziali. Se questa opzione è impostata su ON per un indice spaziale, viene generato un errore. Omettere l'opzione ONLINE o impostare ONLINE su OFF.Un'operazione offline sull'indice che crea, ricompila o elimina un indice spaziale acquisisce un blocco di modifica dello schema (SCH-M) per la tabella. Tale blocco impedisce agli utenti di accedere alla tabella sottostante per la durata dell'operazione.
Nota
Le operazioni sugli indici online sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.
ALLOW_ROW_LOCKS = { ON | OFF }
Specifica se sono consentiti blocchi a livello di riga. Il valore predefinito è ON.ON
I blocchi a livello di riga sono consentiti durante l'accesso all'indice. Motore di database determina quando utilizzare blocchi a livello di riga.OFF
I blocchi a livello di riga non vengono utilizzati.
ALLOW_PAGE_LOCKS = { ON | OFF }
Specifica se sono consentiti blocchi a livello di pagina. Il valore predefinito è ON.ON
I blocchi a livello di pagina sono consentiti durante l'accesso all'indice. Motore di database determina quando utilizzare blocchi a livello di pagina.OFF
I blocchi a livello di pagina non vengono utilizzati.
MAXDOP =max_degree_of_parallelism
Ignora l'opzione di configurazione max degree of parallelism per tutta la durata dell'operazione sull'indice. Utilizzare MAXDOP per limitare il numero di processori utilizzati durante l'esecuzione di un piano parallelo. Il valore massimo è 64 processori.Importante Sebbene l'opzione MAXDOP sia supportata a livello di sintassi, CREATE SPATIAL INDEX attualmente utilizza sempre solo un processore singolo.
I possibili valori di max_degree_of_parallelism sono i seguenti:
1
Disattiva la generazione di piani paralleli.>1
Consente di limitare al valore specificato, o a un valore più basso in base al carico di lavoro corrente del sistema, il numero massimo di processori utilizzati in un'operazione parallela sugli indici.0 (predefinito)
Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.
Per ulteriori informazioni, vedere Configurazione di operazioni parallele sugli indici.
Nota
Le operazioni parallele sugli indici sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.
Osservazioni
Per un'introduzione all'indicizzazione spaziale in SQL Server, vedere Panoramica dell'indicizzazione spaziale.
Ogni opzione può essere specificata una sola volta per ogni istruzione CREATE SPATIAL INDEX. Se un'opzione viene specificata due volte, viene generato un errore.
È possibile creare fino a 249 indici spaziali in ogni colonna spaziale di una tabella. La creazione di più di un indice spaziale in una specifica colonna spaziale può essere utile, ad esempio, per indicizzare parametri di suddivisione a mosaico diversi in un'unica colonna.
Importante |
---|
La creazione di indici spaziali è soggetta anche a diverse altre limitazioni. Per ulteriori informazioni, vedere Restrizioni relative agli indici spaziali. |
Per la compilazione di un indice non è possibile utilizzare il parallelismo di processi disponibile.
Metodi supportati negli indici spaziali
In determinate condizioni, gli indici spaziali supportano diversi metodi geometrici orientati agli insiemi. Per ulteriori informazioni, vedere Metodi di geometria supportati da indici spaziali.
Indici spaziali e partizionamento
Per impostazione predefinita, se un indice spaziale viene creato in una tabella partizionata, l'indice viene partizionato in base allo schema di partizione della tabella. In questo modo, i dati dell'indice e la riga correlata vengono archiviati nella stessa partizione.
In questo caso, per modificare lo schema di partizione della tabella di base, sarebbe necessario eliminare l'indice spaziale prima di poter ripartire la tabella di base. Per evitare questa limitazione, quando si crea un indice spaziale è possibile specificare l'opzione "ON filegroup". Per ulteriori informazioni, vedere "Indici spaziali e filegroup", più avanti in questo argomento.
Indici spaziali e filegroup
Per impostazione predefinita, gli indici spaziali vengono partizionati negli stessi filegroup della tabella in cui l'indice viene specificato. Questo comportamento può essere modificato utilizzando la specifica del filegroup:
[ ON { filegroup_name | "default" } ]
Se si specifica un filegroup per un indice spaziale, l'indice viene inserito in tale filegroup, indipendentemente dallo schema di partizione della tabella.
Viste del catalogo per gli indici spaziali
Le viste del catalogo seguenti sono specifiche degli indici spaziali:
sys.spatial_indexes
Rappresenta le principali informazioni sugli indici per gli indici spaziali.sys.spatial_index_tessellations
Rappresenta le informazioni sullo schema a mosaico e i parametri di ognuno degli indici spaziali.
Per informazioni sulla struttura dei metadati degli indici spaziali, vedere Tabelle interne.
Osservazioni aggiuntive sulla creazione degli indici
Per ulteriori informazioni sulla creazione degli indici, vedere la sezione "Osservazioni" in CREATE INDEX (Transact-SQL).
Autorizzazioni
L'utente deve disporre dell'autorizzazione ALTER per la tabella o la vista oppure deve essere membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_ddladmin e db_owner.
Esempi
A. Creazione di un indice spaziale in una colonna geometrica
Nell'esempio seguente viene creata una tabella denominata SpatialTable contenente una colonna geometry_col di tipo geometry. Viene quindi creato un indice spaziale, SIndx_SpatialTable_geometry_col1, in geometry_col. Nell'esempio viene utilizzato lo schema a mosaico predefinito e viene specificato il riquadro.
CREATE TABLE SpatialTable(id int primary key, geometry_col geometry);
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1
ON SpatialTable(geometry_col)
WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ) );
B. Creazione di un indice spaziale in una colonna geometrica
Nell'esempio seguente viene creato un secondo indice spaziale, SIndx_SpatialTable_geometry_col2, nella colonna geometry_col della tabella SpatialTable. Nell'esempio viene specificato GEOMETRY_GRID come schema a mosaico. Vengono inoltre specificati il riquadro, densità diverse in livelli diversi della griglia e 64 celle per oggetto Nell'esempio viene inoltre impostato il riempimento dell'indice su ON.
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col2
ON SpatialTable(geometry_col)
USING GEOMETRY_GRID
WITH (
BOUNDING_BOX = ( xmin=0, ymin=0, xmax=500, ymax=200 ),
GRIDS = (LOW, LOW, MEDIUM, HIGH),
CELLS_PER_OBJECT = 64,
PAD_INDEX = ON );
C. Creazione di un indice spaziale in una colonna geometrica
Nell'esempio seguente viene creato un terzo indice spaziale, SIndx_SpatialTable_geometry_col3, nella colonna geometry_col della tabella SpatialTable. Nell'esempio viene utilizzato lo schema a mosaico predefinito. Viene specificato il riquadro e vengono utilizzate densità della cella diverse per il terzo e il quarto livelli, mentre viene utilizzato il numero predefinito di celle per oggetto.
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col3
ON SpatialTable(geometry_col)
WITH (
BOUNDING_BOX = ( 0, 0, 500, 200 ),
GRIDS = ( LEVEL_4 = HIGH, LEVEL_3 = MEDIUM ) );
D. Modifica un'opzione specifica degli indici spaziali
Nell'esempio seguente viene ricompilato l'indice spaziale creato nell'esempio precedente, SIndx_SpatialTable_geography_col3, specificando una nuova densità per LEVEL_3 con DROP_EXISTING = ON.
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
ON SpatialTable(geography_col)
WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ),
GRIDS = ( LEVEL_3 = LOW ),
DROP_EXISTING = ON );
E. Creazione di un indice spaziale in una colonna geografica
Nell'esempio seguente viene creata una tabella denominata SpatialTable2 contenente una colonna geography_col di tipo geography. Viene quindi creato un indice spaziale, SIndx_SpatialTable_geography_col1, in geography_col e vengono utilizzati i valori dei parametri predefiniti dello schema a mosaico GEOGRAPHY_GRID.
CREATE TABLE SpatialTable2(id int primary key, object GEOGRAPHY);
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col1
ON SpatialTable2(object);
Nota
Per gli indici di griglie geografiche non è possibile specificare un riquadro.
F. Creazione di un indice spaziale in una colonna geografica
Nell'esempio seguente viene creato un secondo indice spaziale, SIndx_SpatialTable_geography_col2, nella colonna geography_col della tabella SpatialTable2. Nell'esempio viene specificato GEOGRAPHY_GRID come schema a mosaico. Vengono inoltre specificate diverse densità della griglia in livelli diversi e 64 celle per oggetto Nell'esempio viene inoltre impostato il riempimento dell'indice su ON.
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col2
ON SpatialTable2(object)
USING GEOGRAPHY_GRID
WITH (
GRIDS = (MEDIUM, LOW, MEDIUM, HIGH ),
CELLS_PER_OBJECT = 64,
PAD_INDEX = ON );
G. Creazione di un indice spaziale in una colonna geografica
Nell'esempio seguente viene creato un terzo indice spaziale, SIndx_SpatialTable_geography_col3, nella colonna geography_col della tabella SpatialTable2. Nell'esempio vengono utilizzati lo schema a mosaico predefinito, GEOGRAPHY_GRID, e il valore di CELLS_PER_OBJECT predefinito (16).
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
ON SpatialTable2(object)
WITH ( GRIDS = ( LEVEL_3 = HIGH, LEVEL_2 = HIGH ) );
Vedere anche