CREATE INDEX (Transact-SQL)CREATE INDEX (Transact-SQL)

Si applica a:Applies to: sìSQL ServerSQL Server (tutte le versioni supportate) yesSQL ServerSQL Server (all supported versions) Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL Database SìIstanza gestita di SQL di AzureAzure SQL Managed InstanceYesIstanza gestita di SQL di AzureAzure SQL Managed Instance sìAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics sìParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data WarehouseSi applica a:Applies to: sìSQL ServerSQL Server (tutte le versioni supportate) yesSQL ServerSQL Server (all supported versions) Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL Database SìIstanza gestita di SQL di AzureAzure SQL Managed InstanceYesIstanza gestita di SQL di AzureAzure SQL Managed Instance sìAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics sìParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

Crea un indice relazionale per una tabella o una vista.Creates a relational index on a table or view. Viene detto anche indice rowstore, perché è un indice ad albero b-tree sia cluster che non cluster.Also called a rowstore index because it is either a clustered or nonclustered B-tree index. È possibile creare un indice rowstore prima che siano presenti dati nella tabella.You can create a rowstore index before there is data in the table. Usare un indice rowstore per migliorare le prestazioni delle query, in particolare quando le query effettuano le selezioni da colonne specifiche o richiedono valori da organizzare in base a un ordine particolare.Use a rowstore index to improve query performance, especially when the queries select from specific columns or require values to be sorted in a particular order.

Nota

Azure Synapse AnalyticsAzure Synapse Analytics e Parallel Data WarehouseParallel Data Warehouse attualmente non supportano i vincoli UNIQUE.and Parallel Data WarehouseParallel Data Warehouse currently do not support Unique constraints. Eventuali esempi che fanno riferimento ai vincoli UNIQUE sono applicabili solo a SQL ServerSQL Server e Database SQLSQL Database.Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and Database SQLSQL Database.

Suggerimento

Per informazioni sulle linee guida di progettazione degli indici, vedere Guida per la progettazione di indici di SQL Server.For information on index design guidelines, refer to the SQL Server Index Design Guide.

Esempi semplici:Simple examples:

-- Create a nonclustered index on a table or view
CREATE INDEX i1 ON t1 (col1);

-- Create a clustered index on a table and use a 3-part name for the table
CREATE CLUSTERED INDEX i1 ON d1.s1.t1 (col1);

-- Syntax for SQL Server and Azure SQL Database
-- Create a nonclustered index with a unique constraint
-- on 3 columns and specify the sort order for each column
CREATE UNIQUE INDEX i1 ON t1 (col1 DESC, col2 ASC, col3 DESC);

Scenario chiave:Key scenario:

A partire da SQL Server 2016 (13.x) e Database SQLSQL Database, usare un indice non cluster per un indice columnstore per migliorare le prestazioni delle query di data warehousing.Starting with SQL Server 2016 (13.x) and Database SQLSQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. Per altre informazioni, vedere Indici columnstore - Data warehouse.For more information, see Columnstore Indexes - Data Warehouse.

Per altri tipi di indici, vedere:For additional types of indexes, see:

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

Sintassi per SQL Server e per il database SQL di AzureSyntax for SQL Server and Azure SQL Database

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
  
[ ; ]
  
<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON | OFF }
  | RESUMABLE = { ON | OFF }
  | MAX_DURATION = <time> [MINUTES]
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
}

<filter_predicate> ::=
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Indice relazionale compatibile con le versioni precedentiBackward Compatible Relational Index

Importante

La struttura della sintassi dell'indice relazionale compatibile con le versioni precedenti verrà rimossa in una versione futura di SQL ServerSQL Server.The backward compatible relational index syntax structure will be removed in a future version of SQL ServerSQL Server. Evitare di utilizzare questa struttura della sintassi e pianificare la modifica delle applicazioni che ne fanno uso.Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. Usare invece la struttura della sintassi specificata in <relational_index_option>.Use the syntax structure specified in <relational_index_option> instead.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )
    [ WITH <backward_compatible_index_option> [ ,...n ] ]
    [ ON { filegroup_name | "default" } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}

Sintassi per Azure Synapse Analytics e Parallel Data WarehouseSyntax for Azure Synapse Analytics and Parallel Data Warehouse


CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
    [ORDER (column[,...n])]
    [WITH ( DROP_EXISTING = { ON | OFF } )]
[;]


CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
        ( { column [ ASC | DESC ] } [ ,...n ] )
    WITH ( DROP_EXISTING = { ON | OFF } )
[;]


Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgomentiArguments

UNIQUEUNIQUE
Crea un indice univoco per una tabella o una vista.Creates a unique index on a table or view. Un indice univoco non consente l'utilizzo di uno stesso valore di chiave di indice per più righe.A unique index is one in which no two rows are permitted to have the same index key value. L'indice cluster di una vista deve essere univoco.A clustered index on a view must be unique.

In Motore di databaseDatabase Engine non è possibile creare un indice univoco su colonne che includono già valori duplicati, indipendentemente dal fatto che l'opzione IGNORE_DUP_KEY sia impostata o meno su ON.The Motore di databaseDatabase Engine does not allow creating a unique index on columns that already include duplicate values, whether or not IGNORE_DUP_KEY is set to ON. Se si tenta di eseguire questa operazione, Motore di databaseDatabase Engine visualizza un messaggio di errore.If this is tried, the Motore di databaseDatabase Engine displays an error message. Prima di poter creare un indice univoco su una o più colonne di questo tipo, è necessario rimuovere i valori duplicati.Duplicate values must be removed before a unique index can be created on the column or columns. Le colonne utilizzate in un indice univoco devono essere impostate su NOT NULL, perché più valori Null vengono considerati duplicati in fase di creazione dell'indice.Columns that are used in a unique index should be set to NOT NULL, because multiple null values are considered duplicates when a unique index is created.

CLUSTEREDCLUSTERED
Crea un indice in cui l'ordine logico dei valori di chiave determina l'ordine fisico delle righe corrispondenti di una tabella.Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. Nel livello inferiore, o foglia, dell'indice cluster sono contenute le righe di dati effettive della tabella.The bottom, or leaf, level of the clustered index contains the actual data rows of the table. È possibile creare un solo indice cluster alla volta per una tabella o una vista.A table or view is allowed one clustered index at a time.

Una vista con un indice cluster univoco viene definita vista indicizzata.A view with a unique clustered index is called an indexed view. La creazione di un indice cluster univoco per una vista materializza fisicamente la vista.Creating a unique clustered index on a view physically materializes the view. È necessario creare un indice cluster univoco per una vista prima di poter definire altri indici per la stessa vista.A unique clustered index must be created on a view before any other indexes can be defined on the same view. Per altre informazioni, vedere Creare viste indicizzate.For more information, see Create Indexed Views.

Creare l'indice cluster prima di qualsiasi indice non cluster.Create the clustered index before creating any nonclustered indexes. Quando si crea un indice cluster, gli indici non cluster esistenti delle tabelle vengono ricompilati.Existing nonclustered indexes on tables are rebuilt when a clustered index is created.

Se CLUSTERED viene omesso, viene creato un indice non cluster.If CLUSTERED is not specified, a nonclustered index is created.

Nota

Poiché per definizione il livello foglia di un indice cluster corrisponde alle pagine di dati, la creazione di un indice cluster con la clausola ON partition_scheme_name o filegroup_name comporta lo spostamento di una tabella dal filegroup in cui è stata creata nel nuovo schema di partizione o filegroup.Because the leaf level of a clustered index and the data pages are the same by definition, creating a clustered index and using the ON partition_scheme_name or ON filegroup_name clause effectively moves a table from the filegroup on which the table was created to the new partition scheme or filegroup. Prima di creare tabelle o indici in filegroup specifici, verificare i filegroup disponibili e controllare che dispongano di spazio sufficiente per l'indice.Before creating tables or indexes on specific filegroups, verify which filegroups are available and that they have enough empty space for the index.

In alcuni casi la creazione di un indice cluster può abilitare gli indici precedentemente disabilitati.In some cases creating a clustered index can enable previously disabled indexes. Per altre informazioni, vedere Abilitare indici e vincoli e Disabilitare indici e vincoli.For more information, see Enable Indexes and Constraints and Disable Indexes and Constraints.

NONCLUSTEREDNONCLUSTERED
Crea un indice che specifica l'ordinamento logico di una tabella.Creates an index that specifies the logical ordering of a table. Quando si utilizza un indice non cluster, l'ordine fisico delle righe di dati è indipendente dall'ordine delle righe indicizzato.With a nonclustered index, the physical order of the data rows is independent of their indexed order.

Per ogni tabella è possibile definire al massimo 999 indici non cluster, indipendentemente dal fatto che vengano creati in modo implicito tramite vincoli PRIMARY KEY e UNIQUE oppure in modo esplicito tramite CREATE INDEX.Each table can have up to 999 nonclustered indexes, regardless of how the indexes are created: either implicitly with PRIMARY KEY and UNIQUE constraints, or explicitly with CREATE INDEX.

Per le viste indicizzate, gli indici non cluster possono essere creati solo se sulla vista è già stato definito un indice cluster univoco.For indexed views, nonclustered indexes can be created only on a view that has a unique clustered index already defined.

Se non diversamente specificato, il tipo di indice predefinito è NONCLUSTERED.If not otherwise specified, the default index type is NONCLUSTERED.

index_name index_name
Nome dell'indice.Is the name of the index. I nomi di indice devono essere univoci all'interno di una tabella o di una vista, ma non all'interno di un database.Index names must be unique within a table or view, but do not have to be unique within a database. Devono essere anche conformi alle regole degli identificatori.Index names must follow the rules of identifiers.

column column
Una o più colonne su cui è basato l'indice.Is the column or columns on which the index is based. Specificare due o più nomi di colonna per creare un indice composto sui valori combinati delle colonne specificate.Specify two or more column names to create a composite index on the combined values in the specified columns. Elencare le colonne da includere nell'indice composto, in base alla priorità di ordinamento, tra parentesi dopo table_or_view_name.List the columns to be included in the composite index, in sort-priority order, inside the parentheses after table_or_view_name.

In una singola chiave di indice composto è possibile combinare al massimo 32 colonne.Up to 32 columns can be combined into a single composite index key. Tutte le colonne di una chiave di indice composto devono appartenere alla stessa tabella o vista.All the columns in a composite index key must be in the same table or view. La dimensione massima consentita dei valori combinati dell'indice è 900 byte per un indice cluster o 1700 per un indice non cluster.The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. I limiti sono 16 colonne e 900 byte per le versioni precedenti a Database SQLSQL Database e SQL Server 2016 (13.x).The limits are 16 columns and 900 bytes for versions before Database SQLSQL Database and SQL Server 2016 (13.x).

Le colonne con tipo di dati LOB (Large Object) ntext, text, varchar(max) , nvarchar(max) , varbinary(max) , xml o image non possono essere specificate come colonne chiave di un indice.Columns that are of the large object (LOB) data types ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image cannot be specified as key columns for an index. Inoltre, una definizione di vista non può includere colonne di tipo ntext, text o image anche se non vi viene fatto riferimento nell'istruzione CREATE INDEX.Also, a view definition cannot include ntext, text, or image columns, even if they are not referenced in the CREATE INDEX statement.

È possibile creare indici su colonne di tipo CLR definito dall'utente se il tipo supporta l'ordinamento binario.You can create indexes on CLR user-defined type columns if the type supports binary ordering. È inoltre possibile creare indici su colonne calcolate definite come chiamate di metodo da una colonna con tipo definito dall'utente, a condizione che i metodi siano contrassegnati come deterministici e non eseguano operazioni di accesso ai dati.You can also create indexes on computed columns that are defined as method invocations off a user-defined type column, as long as the methods are marked deterministic and do not perform data access operations. Per altre informazioni sull'indicizzazione di colonne di tipo CLR definito dall'utente, vedere Tipi CLR definiti dall'utente.For more information about indexing CLR user-defined type columns, see CLR User-defined Types.

[ ASC | DESC ][ ASC | DESC ]
Determina se il tipo di ordinamento della colonna di indice specificata è crescente o decrescente.Determines the ascending or descending sort direction for the particular index column. Il valore predefinito è ASC.The default is ASC.

INCLUDE ( column [ , ... n ] ) INCLUDE (column [ ,... n ] )
Specifica le colonne non chiave da aggiungere al livello foglia dell'indice non cluster.Specifies the non-key columns to be added to the leaf level of the nonclustered index. L'indice non cluster può essere univoco o non univoco.The nonclustered index can be unique or non-unique.

I nomi di colonna non possono essere ripetuti nell'elenco INCLUDE e non possono essere utilizzati contemporaneamente per colonne chiave e non chiave.Column names cannot be repeated in the INCLUDE list and cannot be used simultaneously as both key and non-key columns. Gli indici non cluster contengono sempre le colonne dell'indice cluster se nella tabella è definito un indice cluster.Nonclustered indexes always contain the clustered index columns if a clustered index is defined on the table. Per altre informazioni, vedere Creare indici con colonne incluse.For more information, see Create Indexes with Included Columns.

È possibile usare qualsiasi tipo di dati, ad eccezione di text, ntext e image.All data types are allowed except text, ntext, and image. L'indice dovrà essere creato o ricompilato offline (ONLINE = OFF) se una delle colonne non chiave specificate è di tipo varchar(max) , nvarchar(max) o varbinary(max) .The index must be created or rebuilt offline (ONLINE = OFF) if any one of the specified non-key columns are varchar(max), nvarchar(max), or varbinary(max) data types.

Come colonne incluse è possibile utilizzare colonne calcolate che sono deterministiche, sia precise che imprecise.Computed columns that are deterministic and either precise or imprecise can be included columns. Le colonne calcolate derivate dai tipi di dati image, ntext, text, varchar(max) , nvarchar(max) , varbinary(max) e xml possono essere incluse in colonne non chiave purché il tipo di dati della colonna calcolata sia consentito come colonna inclusa.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be included in non-key columns as long as the computed column data types is allowable as an included column. Per altre informazioni, vedere Indici per le colonne calcolate.For more information, see Indexes on Computed Columns.

Per informazioni sulla creazione di un indice XML, vedere CREATE XML INDEX.For information on creating an XML index, see CREATE XML INDEX.

WHERE <filter_predicate> WHERE <filter_predicate>
Crea un indice filtrato specificando le righe da includere nell'indice.Creates a filtered index by specifying which rows to include in the index. L'indice filtrato deve essere un indice non cluster in una tabella.The filtered index must be a nonclustered index on a table. Crea statistiche filtrate per le righe di dati dell'indice filtrato.Creates filtered statistics for the data rows in the filtered index.

Il predicato del filtro utilizza una logica di confronto semplice e non può fare riferimento a una colonna calcolata, a una colonna con tipo definito dall'utente (UDT), a una colonna con tipo di dati spaziale o a una colonna con tipo di dati hierarchyID.The filter predicate uses simple comparison logic and cannot reference a computed column, a UDT column, a spatial data type column, or a hierarchyID data type column. I confronti in cui vengono utilizzati valori letterali NULL non sono consentiti con gli operatori di confronto.Comparisons using NULL literals are not allowed with the comparison operators. In alternativa, utilizzare gli operatori IS NULL e IS NOT NULL.Use the IS NULL and IS NOT NULL operators instead.

Di seguito sono riportati alcuni esempi di predicati di filtro per la tabella Production.BillOfMaterials:Here are some examples of filter predicates for the Production.BillOfMaterials table:

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Gli indici filtrati non si applicano agli indici XML e full-text.Filtered indexes do not apply to XML indexes and full-text indexes. Per gli indici UNIQUE, solo le righe selezionate devono avere valori di indice univoci.For UNIQUE indexes, only the selected rows must have unique index values. Gli indici filtrati non consentono l'opzione IGNORE_DUP_KEY.Filtered indexes do not allow the IGNORE_DUP_KEY option.

ON partition_scheme_name ( column_name )ON partition_scheme_name ( column_name )

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica lo schema di partizione che definisce i filegroup a cui verrà eseguito il mapping delle partizioni di un indice partizionato.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index will be mapped. È necessario che lo schema di partizione sia presente nel database e sia stato creato eseguendo CREATE PARTITION SCHEME o ALTER PARTITION SCHEME.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME. column_name specifica la colonna in base alla quale verrà eseguita la partizione di un indice partizionato.column_name specifies the column against which a partitioned index will be partitioned. La colonna deve corrispondere all'argomento della funzione di partizione usata da partition_scheme_name per tipo di dati, lunghezza e precisione.This column must match the data type, length, and precision of the argument of the partition function that partition_scheme_name is using. column_name non è limitato alle colonne nella definizione dell'indice.column_name is not restricted to the columns in the index definition. È possibile specificare qualsiasi colonna della tabella di base tranne quando si esegue la partizione di un indice UNIQUE. In questo caso il valore column_name deve essere scelto tra quelli usati come chiave univoca.Any column in the base table can be specified, except when partitioning a UNIQUE index, column_name must be chosen from among those used as the unique key. Questa restrizione consente a Motore di databaseDatabase Engine di verificare l'univocità dei valori di chiave all'interno di una singola partizione.This restriction allows the Motore di databaseDatabase Engine to verify uniqueness of key values within a single partition only.

Nota

Quando si partiziona un indice cluster non univoco, per impostazione predefinita Motore di databaseDatabase Engine aggiunge la colonna di partizionamento all'elenco delle chiavi di indice cluster, se non è già presente.When you partition a non-unique, clustered index, the Motore di databaseDatabase Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. Quando si partiziona un indice non cluster non univoco, Motore di databaseDatabase Engine aggiunge la colonna di partizionamento come colonna non chiave (inclusa) dell'indice, se non è già presente.When partitioning a non-unique, nonclustered index, the Motore di databaseDatabase Engine adds the partitioning column as a non-key (included) column of the index, if it is not already specified.

Se non si specifica partition_scheme_name o filegroup e la tabella è partizionata, l'indice viene posizionato nello stesso schema di partizione, usando la stessa colonna di partizionamento della tabella sottostante.If partition_scheme_name or filegroup is not specified and the table is partitioned, the index is placed in the same partition scheme, using the same partitioning column, as the underlying table.

Nota

Non è possibile specificare uno schema di partizione per un indice XML.You cannot specify a partitioning scheme on an XML index. Se la tabella di base è partizionata, l'indice XML utilizzerà lo stesso schema di partizione della tabella.If the base table is partitioned, the XML index uses the same partition scheme as the table.

Per altre informazioni sul partizionamento degli indici, vedere Tabelle e indici partizionati.For more information about partitioning indexes, Partitioned Tables and Indexes.

ON filegroup_nameON filegroup_name

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive)Applies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later)

Crea l'indice specificato nel filegroup specificato.Creates the specified index on the specified filegroup. Se non viene specificata una posizione e la tabella o la vista non è partizionata, l'indice utilizzerà lo stesso filegroup della tabella o della vista sottostante.If no location is specified and the table or view is not partitioned, the index uses the same filegroup as the underlying table or view. Il filegroup deve essere già esistente.The filegroup must already exist.

ON " default "ON " default "

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Crea l'indice specificato nello stesso filegroup o schema di partizione della tabella o della vista.Creates the specified index on the same filegroup or partition scheme as the table or view.

In questo contesto il termine default non rappresenta una parola chiave,The term default, in this context, is not a keyword. È un identificatore per il filegroup predefinito e pertanto deve essere delimitato, ad esempio ON " default " o ON [ default ] .It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Si tratta dell'impostazione predefinita.This is the default setting. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

Nota

"default" non indica il filegroup predefinito del database nel contesto di CREATE INDEX,"default" does not indicate the database default filegroup in the context of CREATE INDEX. a differenza di CREATE TABLE dove "default" individua la tabella nel filegroup predefinito del database.This differs from CREATE TABLE, where "default" locates the table on the database default filegroup.

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive)Applies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later)

Specifica la posizione dei dati FILESTREAM per la tabella quando viene creato un indice cluster.Specifies the placement of FILESTREAM data for the table when a clustered index is created. La clausola FILESTREAM_ON consente di spostare i dati FILESTREAM in uno schema di partizione o in un filegroup FILESTREAM diverso.The FILESTREAM_ON clause allows FILESTREAM data to be moved to a different FILESTREAM filegroup or partition scheme.

filestream_filegroup_name è il nome di un filegroup FILESTREAM.filestream_filegroup_name is the name of a FILESTREAM filegroup. Nel filegroup deve essere disponibile un file definito usando un'istruzione CREATE DATABASE o ALTER DATABASE. In caso contrario, viene generato un errore.The filegroup must have one file defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement; otherwise, an error is raised.

Se la tabella è partizionata, la clausola FILESTREAM_ON deve essere inclusa e deve specificare uno schema di partizione dei filegroup FILESTREAM che utilizzi la stessa funzione di partizione e le stesse colonne di partizione dello schema di partizione per la tabella.If the table is partitioned, the FILESTREAM_ON clause must be included and must specify a partition scheme of FILESTREAM filegroups that uses the same partition function and partition columns as the partition scheme for the table. In caso contrario, viene generato un errore.Otherwise, an error is raised.

Se la tabella non è partizionata, la colonna FILESTREAM non può essere partizionata.If the table is not partitioned, the FILESTREAM column cannot be partitioned. I dati FILESTREAM per la tabella devono essere archiviati in un singolo filegroup specificato nella clausola FILESTREAM_ON.FILESTREAM data for the table must be stored in a single filegroup that is specified in the FILESTREAM_ON clause.

È possibile specificare FILESTREAM_ON NULL in un'istruzione CREATE INDEX se si sta creando un indice cluster e se nella tabella non è presente nessuna colonna FILESTREAM.FILESTREAM_ON NULL can be specified in a CREATE INDEX statement if a clustered index is being created and the table does not contain a FILESTREAM column.

Per altre informazioni, vedere FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

<object>::=<object>::=

Oggetto con nome completo o non completo che si desidera indicizzare.Is the fully qualified or nonfully qualified object to be indexed.

database_name database_name
Nome del database.Is the name of the database.

schema_name schema_name
Nome dello schema a cui appartiene la tabella o la vista.Is the name of the schema to which the table or view belongs.

table_or_view_name table_or_view_name
Nome della tabella o della vista che si desidera indicizzare.Is the name of the table or view to be indexed.

Per poter creare un indice per una vista, è necessario che la vista sia definita con l'opzione SCHEMABINDING.The view must be defined with SCHEMABINDING to create an index on it. Prima di creare qualsiasi indice non cluster per una vista, è necessario creare un indice cluster univoco.A unique clustered index must be created on a view before any nonclustered index is created. Per ulteriori informazioni sulle viste indicizzate, vedere la sezione Osservazioni.For more information about indexed views, see the Remarks section.

A partire da SQL Server 2016 (13.x) l'oggetto può essere una tabella archiviata con un indice columnstore cluster.Starting with SQL Server 2016 (13.x), the object can be a table stored with a clustered columnstore index.

database SQL di AzureAzure SQL Database supporta il formato del nome in tre parti database_name.[schema_name].object_name quando database_name è il database corrente o database_name è tempdbe object_name inizia con #.supports the three-part name format database_name.[schema_name].object_name when the database_name is the current database or the database_name is tempdb and the object_name starts with #.

<relational_index_option>::= <relational_index_option>::=
Specifica le opzioni da usare quando si crea l'indice.Specifies the options to use when you create the index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica il riempimento dell'indice.Specifies index padding. Il valore predefinito è OFF.The default is OFF.

ONON
La percentuale di spazio disponibile specificata da fillfactor viene applicata alle pagine di livello intermedio dell'indice.The percentage of free space that is specified by fillfactor is applied to the intermediate-level pages of the index.

OFF o fillfactor non è specificatoOFF or fillfactor is not specified
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.The intermediate-level pages are filled to near capacity, leaving sufficient space for at least one row of the maximum size the index can have, considering the set of keys on the intermediate pages.

L'opzione PAD_INDEX risulta utile solo quando si specifica FILLFACTOR, in quanto PAD_INDEX usano la percentuale specificata in FILLFACTOR.The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. Se la percentuale specificata in FILLFACTOR non consente l'inserimento di una riga, Motore di databaseDatabase Engine sostituisce internamente tale percentuale in modo da rendere disponibile lo spazio minimo necessario.If the percentage specified for FILLFACTOR is not large enough to allow for one row, the Motore di databaseDatabase Engine internally overrides the percentage to allow for the minimum. Il numero di righe di una pagina intermedia dell'indice non è mai minore di due, indipendentemente dal valore di fillfactor.The number of rows on an intermediate index page is never less than two, regardless of how low the value of fillfactor.

Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH PAD_INDEX equivale a WITH PAD_INDEX = ON.In backward compatible syntax, WITH PAD_INDEX is equivalent to WITH PAD_INDEX = ON.

FILLFACTOR = fillfactorFILLFACTOR =fillfactor

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica una percentuale che indica il livello di riempimento del livello foglia di ogni pagina di indice applicato dal Motore di databaseDatabase Engine durante la creazione o la ricompilazione dell'indice.Specifies a percentage that indicates how full the Motore di databaseDatabase Engine should make the leaf level of each index page during index creation or rebuild. fillfactor deve essere un valore intero compreso tra 1 e 100.fillfactor must be an integer value from 1 to 100. Se fillfactor è 100, Motore di databaseDatabase Engine crea indici con pagine foglia riempite fino alla capacità massima.If fillfactor is 100, the Motore di databaseDatabase Engine creates indexes with leaf pages filled to capacity.

L'impostazione di FILLFACTOR viene applicata solo in fase di creazione o di ricompilazione dell'indice.The FILLFACTOR setting applies only when the index is created or rebuilt. La percentuale specificata di spazio vuoto delle pagine non viene mantenuta in modo dinamico da Motore di databaseDatabase Engine.The Motore di databaseDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Per visualizzare l'impostazione del fattore di riempimento, usare la vista del catalogo sys.indexes.To view the fill factor setting, use the sys.indexes catalog view.

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 databaseDatabase Engine durante la creazione dell'indice cluster.Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the Motore di databaseDatabase Engine redistributes the data when it creates the clustered index.

Per altre informazioni, vedere Specificare un fattore di riempimento per un indice.For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica se i risultati temporanei dell'ordinamento devono essere archiviati in tempdb.Specifies whether to store temporary sort results in tempdb. Il valore predefinito è OFF, tranne per il database SQL di Azure con servizio Hyperscale. Per tutte le operazioni di compilazione dell'indice in Hyperscale, SORT_IN_TEMPDB è sempre ON, indipendentemente dall'opzione specificata, a meno che non venga usata la ricompilazione dell'indice ripristinabile.The default is OFF except for Azure SQL Database Hyperscale.For all index build operations in Hyperscale, SORT_IN_TEMPDB is always ON, regardless of the option specified unless resumable index rebuild is used.

ONON
I risultati intermedi dell'ordinamento usati per la compilazione dell'indice vengono archiviati in tempdb.The intermediate sort results that are used to build the index are stored in tempdb. In questo modo si può ridurre il tempo necessario per creare un indice se tempdb si trova in un set di dischi diverso rispetto al database utente.This may reduce the time required to create an index if tempdb is on a different set of disks than the user database. La quantità di spazio su disco utilizzata durante la compilazione dell'indice sarà tuttavia maggiore.However, this increases the amount of disk space that is used during the index build.

OFFOFF
I risultati intermedi dell'ordinamento vengono archiviati nello stesso database dell'indice.The intermediate sort results are stored in the same database as the index.

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.In addition to the space required in the user database to create the index, tempdb must have about the same amount of additional space to hold the intermediate sort results. Per altre informazioni, vedere Opzione SORT_IN_TEMPDB per gli indici.For more information, see SORT_IN_TEMPDB Option For Indexes.

Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH SORT_IN_TEMPDB equivale a WITH SORT_IN_TEMPDB = ON.In backward compatible syntax, WITH SORT_IN_TEMPDB is equivalent to WITH SORT_IN_TEMPDB = ON.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
Specifica l'errore restituito quando un'operazione di inserimento tenta di inserire valori di chiave duplicati in un indice univoco.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. L'opzione IGNORE_DUP_KEY viene applicata solo alle operazioni di inserimento eseguite dopo la creazione o la ricompilazione dell'indice.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. L'opzione non ha alcun effetto se si esegue CREATE INDEX, ALTER INDEX o UPDATE.The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. Il valore predefinito è OFF.The default is OFF.

ONON
Viene visualizzato un messaggio di avviso quando i valori di chiave duplicati vengono inseriti in un indice univoco.A warning message will occur when duplicate key values are inserted into a unique index. Avranno esito negativo solo le righe che violano il vincolo di unicità.Only the rows violating the uniqueness constraint will fail.

OFFOFF
Viene visualizzato un messaggio di errore quando i valori di chiave duplicati vengono inseriti in un indice univoco.An error message will occur when duplicate key values are inserted into a unique index. Viene eseguito il rollback dell'intera operazione INSERT.The entire INSERT operation will be rolled back.

L'opzione IGNORE_DUP_KEY non può essere impostata su ON per gli indici creati in una vista, negli indici non univoci, negli indici XML, spaziali e filtrati.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Per visualizzare IGNORE_DUP_KEY, usare sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH IGNORE_DUP_KEY equivale a WITH IGNORE_DUP_KEY = ON.In backward compatible syntax, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF}STATISTICS_NORECOMPUTE = { ON | OFF}
Specifica se le statistiche di distribuzione vengono ricalcolate.Specifies whether distribution statistics are recomputed. Il valore predefinito è OFF.The default is OFF.

ONON
Le statistiche non aggiornate non vengono ricalcolate automaticamente.Out-of-date statistics are not automatically recomputed.

OFFOFF
Abilita l'aggiornamento automatico delle statistiche.Automatic statistics updating are enabled.

Per ripristinare l'aggiornamento automatico delle statistiche, impostare l'opzione STATISTICS_NORECOMPUTE su OFF oppure eseguire UPDATE STATISTICS senza la clausola NORECOMPUTE.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

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.Disabling automatic recomputation of distribution statistics may prevent the query optimizer from picking optimal execution plans for queries involving the table.

Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH STATISTICS_NORECOMPUTE equivale a WITH STATISTICS_NORECOMPUTE = ON.In backward compatible syntax, WITH STATISTICS_NORECOMPUTE is equivalent to WITH STATISTICS_NORECOMPUTE = ON.

STATISTICS_INCREMENTAL = { ON | OFF }STATISTICS_INCREMENTAL = { ON | OFF }

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2014 (12.x)SQL Server 2014 (12.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x)) and database SQL di AzureAzure SQL Database

Se è specificato ON, le statistiche create sono statistiche per partizione.When ON, the statistics created are per partition statistics. Se è specificato OFF, l'albero delle statistiche viene eliminato e le statistiche vengono ricalcolate da SQL ServerSQL Server.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. Il valore predefinito è OFF.The default is OFF.

Se le statistiche per partizione non sono supportate, l'opzione viene ignorata e viene generato un avviso.If per partition statistics are not supported the option is ignored and a warning is generated. Le statistiche incrementali non sono supportate per i seguenti tipi di statistiche:Incremental stats are not supported for following statistics types:

  • Statistiche create con indici che non hanno il partizionamento allineato con la tabella di base.Statistics created with indexes that are not partition-aligned with the base table.
  • Statistiche create per i database secondari leggibili Always On.Statistics created on Always On readable secondary databases.
  • Statistiche create per i database di sola lettura.Statistics created on read-only databases.
  • Statistiche create per gli indici filtrati.Statistics created on filtered indexes.
  • Statistiche create per le viste.Statistics created on views.
  • Statistiche create per le tabelle interne.Statistics created on internal tables.
  • Statistiche create con indici spaziali o indici XML.Statistics created with spatial indexes or XML indexes.

DROP_EXISTING = { ON | OFF }DROP_EXISTING = { ON | OFF }
Consente di eliminare e ricompilare l'indice cluster o non cluster esistente con le specifiche colonne modificate e di mantenere lo stesso nome per l'indice.Is an option to drop and rebuild the existing clustered or nonclustered index with modified column specifications, and keep the same name for the index. Il valore predefinito è OFF.The default is OFF.

ONON
Specifica che l'indice esistente deve essere eliminato e ricompilato e che deve avere lo stesso nome del parametro index_name.Specifies to drop and rebuild the existing index, which must have the same name as the parameter index_name.

OFFOFF
Specifica che l'indice esistente non deve essere eliminato e ricompilato.Specifies not to drop and rebuild the existing index. Se il nome di indice specificato esiste già, SQL Server visualizza un messaggio di errore.SQL Server displays an error if the specified index name already exists.

Con DROP_EXISTING è possibile modificare:With DROP_EXISTING, you can change:

  • Un indice rowstore non cluster in un indice rowstore cluster.A nonclustered rowstore index to a clustered rowstore index.

Con DROP_EXISTING non è possibile modificare:With DROP_EXISTING, you cannot change:

  • Un indice rowstore cluster in un indice rowstore non cluster.A clustered rowstore index to a nonclustered rowstore index.
  • Un indice columnstore cluster in qualsiasi tipo di indice rowstore.A clustered columnstore index to any type of rowstore index.

Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH DROP_EXISTING equivale a WITH DROP_EXISTING = ON.In backward compatible syntax, WITH DROP_EXISTING is equivalent to WITH DROP_EXISTING = ON.

ONLINE = { ON | OFF }ONLINE = { ON | OFF }
Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e la modifica dei dati durante l'operazione sugli indici.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. Il valore predefinito è OFF.The default is OFF.

Importante

Le operazioni sugli indici online sono disponibili solo in alcune edizioni di MicrosoftMicrosoftSQL ServerSQL Server.Online index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Per un elenco delle funzionalità supportate dalle edizioni di SQL ServerSQL Server, vedere Edizioni e funzionalità supportate per SQL Server 2016.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016.

ONON
I blocchi di tabella a lungo termine non vengono mantenuti per la durata dell'operazione sugli indici.Long-term table locks are not held for the duration of the index operation. Durante la fase principale dell'operazione viene mantenuto solo un blocco preventivo condiviso (IS, Intent Shared) sulla tabella di origine.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. in modo da consentire l'esecuzione di query o l'aggiornamento della tabella sottostante e degli indici.This enables queries or updates to the underlying table and indexes to proceed. All'inizio dell'operazione viene mantenuto un blocco condiviso (S) sull'oggetto di origine per un periodo molto breve.At the start of the operation, a Shared (S) lock is held on the source object for a very short period of time. Al termine dell'operazione, per un breve periodo viene acquisito un blocco condiviso (S) sull'origine, in caso di creazione di un indice non cluster. In caso di creazione o di eliminazione di un indice cluster online o di ricompilazione di un indice cluster o non cluster, viene acquisito un blocco di modifica dello schema (SCH-M).At the end of the operation, for a short period of time, an S (Shared) lock is acquired on the source if a nonclustered index is being created; or an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online and when a clustered or nonclustered index is being rebuilt. L'opzione ONLINE non può essere impostata su ON quando viene creato un indice per una tabella temporanea locale.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
I blocchi di tabella vengono applicati per la durata dell'operazione sugli indici.Table locks are applied for the duration of the index operation. Un'operazione sugli indici offline che crea, ricompila o elimina un indice cluster oppure ricompila o elimina un indice non cluster acquisisce un blocco di modifica dello schema (SCH-M) sulla tabella.An offline index operation that creates, rebuilds, or drops a clustered index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. Il blocco impedisce agli utenti di accedere alla tabella sottostante per la durata dell'operazione.This prevents all user access to the underlying table for the duration of the operation. Un'operazione sugli indici offline che crea un indice non cluster acquisisce un blocco condiviso (S) sulla tabella.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Tale blocco impedisce l'aggiornamento della tabella sottostante ma consente operazioni di lettura, ad esempio l'esecuzione di istruzioni SELECT.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Per altre informazioni, vedere Perform Index Operations Online.For more information, see Perform Index Operations Online.

È possibile creare online tutti gli indici, inclusi quelli di tabelle temporanee globali, ad eccezione dei casi seguenti:Indexes, including indexes on global temp tables, can be created online except for the following cases:

  • Indice XMLXML index
  • Indice di una tabella temporanea localeIndex on a local temp table
  • Indice cluster univoco iniziale su una vistaInitial unique clustered index on a view
  • Indici cluster disabilitatiDisabled clustered indexes
  • Indici columnstoreColumnstore indexes
  • Indice cluster, se la tabella sottostante contiene tipi di dati LOB (image, ntext, text) e tipi spazialiClustered index, if the underlying table contains LOB data types (image, ntext, text) and spatial data types
  • Le colonne varchar(max) e varbinary(max) non possono fare parte di un indice.varchar(max) and varbinary(max) columns cannot be part of an index. In SQL ServerSQL Server (a partire da SQL Server 2012 (11.x)SQL Server 2012 (11.x)) e in database SQL di AzureAzure SQL Database, quando una tabella contiene le colonne varchar(max) o varbinary(max) , è possibile compilare o ricompilare un indice cluster contenente altre colonne usando l'opzione ONLINE.In SQL ServerSQL Server (Starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and database SQL di AzureAzure SQL Database, when a table contains varchar(max) or varbinary(max) columns, a clustered index containing other columns can be built or rebuilt using the ONLINE option. database SQL di AzureAzure SQL Database non consente l'opzione ONLINE quando la tabella di base contiene le colonne varchar(max) o varbinary(max)does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns

Per altre informazioni, vedere Funzionamento delle operazioni sugli indici online.For more information, see How Online Index Operations Work.

RESUMABLE = { ON | OFF}RESUMABLE = { ON | OFF}

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

Specifica se un'operazione sull'indice online è ripristinabile.Specifies whether an online index operation is resumable.

ONON
L'operazione sull'indice è ripristinabile.Index operation is resumable.

OFFOFF
L'operazione sull'indice non è ripristinabile.Index operation is not resumable.

MAX_DURATION = time [MINUTES] usato con RESUMABLE = ON (richiede ONLINE = ON)MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON)

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

Indica il tempo (un valore intero specificato in minuti) di esecuzione di un'operazione sull'indice online ripristinabile prima di essere sospesa.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

Importante

Per informazioni più dettagliate sulle operazioni di indice eseguibili online, vedere Linee guida per operazioni di indice online.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Nota

Negli indici columnstore non sono supportate le ricompilazioni degli indici online ripristinabili.Resumable online index rebuilds are not supported on columnstore indexes.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica se sono consentiti blocchi di riga.Specifies whether row locks are allowed. Il valore predefinito è ON.The default is ON.

ONON
I blocchi di riga sono consentiti durante l'accesso all'indice.Row locks are allowed when accessing the index. Il Motore di databaseDatabase Engine determina quando usare blocchi di riga.The Motore di databaseDatabase Engine determines when row locks are used.

OFFOFF
I blocchi di riga non vengono utilizzati.Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica se sono consentiti blocchi a livello di pagina.Specifies whether page locks are allowed. Il valore predefinito è ON.The default is ON.

ONON
I blocchi a livello di pagina sono consentiti durante l'accesso all'indice.Page locks are allowed when accessing the index. Il Motore di databaseDatabase Engine determina quando utilizzare blocchi a livello di pagina.The Motore di databaseDatabase Engine determines when page locks are used.

OFFOFF
I blocchi a livello di pagina non vengono utilizzati.Page locks are not used.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

Specifica se eseguire o meno l'ottimizzazione per la contesa di inserimento dell'ultima pagina.Specifies whether or not to optimize for last-page insert contention. Il valore predefinito è OFF.The default is OFF. Per altre informazioni, vedere le sezione Chiavi sequenziali.See the Sequential Keys section for more information.

MAXDOP = max_degree_of_parallelism MAXDOP = max_degree_of_parallelism
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Sostituisce l'opzione di configurazione max degree of parallelism per la durata dell'operazione sull'indice.Overrides the max degree of parallelism configuration option for the duration of the index operation. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option. Utilizzare MAXDOP per limitare il numero di processori utilizzati durante l'esecuzione di un piano parallelo.Use MAXDOP to limit the number of processors used in a parallel plan execution. Il valore massimo è 64 processori.The maximum is 64 processors.

max_degree_of_parallelism può essere:max_degree_of_parallelism can be:

11
Disattiva la generazione di piani paralleli.Suppresses parallel plan generation.

>1>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.Restricts the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload.

0 (predefinito)0 (default)
Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.Uses the actual number of processors or fewer based on the current system workload.

Per altre informazioni, vedere Configurazione di operazioni parallele sugli indici.For more information, see Configure Parallel Index Operations.

Nota

Le operazioni parallele sugli indici non sono disponibili in tutte le edizioni di MicrosoftMicrosoftSQL ServerSQL Server.Parallel index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Per un elenco delle funzionalità supportate dalle edizioni di SQL ServerSQL Server, vedere Edizioni e funzionalità supportate per SQL Server 2016 ed Edizioni e funzionalità supportate per SQL Server 2017.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016 and Editions and Supported Features for SQL Server 2017.

DATA_COMPRESSIONDATA_COMPRESSION
Specifica l'opzione di compressione dei dati per l'indice, il numero di partizione o l'intervallo di partizioni specificato.Specifies the data compression option for the specified index, partition number, or range of partitions. descritte di seguito:The options are as follows:

NONENONE
L'indice o le partizioni specificate non vengono compressi.Index or specified partitions are not compressed.

ROWROW
L'indice o le partizioni specificate vengono compressi utilizzando la compressione di riga.Index or specified partitions are compressed by using row compression.

PAGEPAGE
L'indice o le partizioni specificate vengono compressi utilizzando la compressione di pagina.Index or specified partitions are compressed by using page compression.

Per altre informazioni sulla compressione, vedere Compressione dei dati.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

Specifica le partizioni alle quali si applica l'impostazione DATA_COMPRESSION.Specifies the partitions to which the DATA_COMPRESSION setting applies. Se l'indice non è partizionato, l'argomento ON PARTITIONS genererà un errore.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Se la clausola ON PARTITIONS non viene fornita, l'opzione DATA_COMPRESSION si applica a tutte le partizioni di un indice partizionato.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> può essere specificato nei modi seguenti:<partition_number_expression> can be specified in the following ways:

  • Specificare il numero di una partizione, ad esempio ON PARTITIONS (2).Provide the number for a partition, for example: ON PARTITIONS (2).
  • Specificare i numeri di partizione per più partizioni singole separati da virgole, ad esempio ON PARTITIONS (1, 5).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • Specificare sia intervalli, sia singole partizioni, ad esempio ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions, for example: ON PARTITIONS (2, 4, 6 TO 8).

È possibile specificare <range> sotto forma di numeri di partizione separati dalla parola TO, ad esempio: ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

Per impostare tipi diversi di compressione dei dati per partizioni diverse, specificare più volte l'opzione DATA_COMPRESSION, ad esempio:To set different types of data compression for different partitions, specify the DATA_COMPRESSION option more than once, for example:

REBUILD WITH
(
  DATA_COMPRESSION = NONE ON PARTITIONS (1),
  DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
  DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

OsservazioniRemarks

L'istruzione CREATE INDEX viene ottimizzata come qualsiasi altra query.The CREATE INDEX statement is optimized like any other query. Al fine di limitare le operazioni di I/O, è possibile che Query Processor scelga di sottoporre ad analisi un altro indice anziché eseguire un'analisi di tabella.To save on I/O operations, the query processor may choose to scan another index instead of performing a table scan. In alcune situazioni è possibile che l'operazione di ordinamento venga eliminata.The sort operation may be eliminated in some situations. Nei computer multiprocessore l'istruzione CREATE INDEX può utilizzare più processori per eseguire le operazioni di analisi e ordinamento associate alla creazione dell'indice, in modo identico alle altre query.On multiprocessor computers CREATE INDEX can use more processors to perform the scan and sort operations associated with creating the index, in the same way as other queries do. Per altre informazioni, vedere Configurazione di operazioni parallele sugli indici.For more information, see Configure Parallel Index Operations.

L'operazione di creazione dell'indice può essere sottoposta a una registrazione minima se è impostato il modello di recupero del database con registrazione minima o con registrazione minima delle operazioni bulk.The create index operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

È possibile creare indici per una tabella temporanea.Indexes can be created on a temporary table. Quando si elimina la tabella o termina la sessione, vengono eliminati anche gli indici associati.When the table is dropped or the session ends, the indexes are dropped.

Un indice cluster può essere compilato in base a una variabile di tabella quando viene creata una chiave primaria.A clustered index can be built on a table variable when a Primary Key is created. Quando la query viene completata o la sessione termina, l'indice viene eliminato.When the query completes or the session ends, the index is dropped.

Gli indici supportano proprietà estese.Indexes support extended properties.

Indici clusterClustered Indexes

La creazione di un indice cluster per una tabella (heap) e l'eliminazione e la ricreazione di un indice cluster esistente richiedono la disponibilità di un'area di lavoro aggiuntiva nel database per contenere l'ordinamento dei dati e una copia temporanea della tabella originale o dei dati dell'indice cluster esistenti.Creating a clustered index on a table (heap) or dropping and re-creating an existing clustered index requires additional workspace to be available in the database to accommodate data sorting and a temporary copy of the original table or existing clustered index data. Per altre informazioni sugli indici cluster, vedere Creare indici cluster e Architettura e guida per la progettazione degli indici di SQL Server.For more information about clustered indexes, see Create Clustered Indexes and the SQL Server Index Architecture and Design Guide.

Indici non clusterNonclustered Indexes

A partire da SQL Server 2016 (13.x) e database SQL di AzureAzure SQL Database è possibile creare un indice non cluster per una tabella archiviata come indice columnstore cluster.Starting with SQL Server 2016 (13.x) and in database SQL di AzureAzure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. Se si crea prima un indice non cluster per una tabella archiviata come heap o indice cluster, l'indice verrà conservato se in un secondo tempo la tabella viene convertita in un indice columnstore cluster.If you first create a nonclustered index on a table stored as a heap or clustered index, the index will persist if you later convert the table to a clustered columnstore index. Non è inoltre necessario eliminare l'indice non cluster quando si ricompila l'indice columnstore cluster.It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

Limitazioni e restrizioni:Limitations and Restrictions:

  • L'opzione FILESTREAM_ON non è valida quando si crea un indice non cluster per una tabella archiviata come indice columnstore cluster.The FILESTREAM_ON option is not valid when you create a nonclustered index on a table stored as a clustered columnstore index.

Indici univociUnique Indexes

Quando esiste un indice univoco, ogni volta che vengono aggiunti nuovi dati tramite un'operazione di inserimento, Motore di databaseDatabase Engine verifica l'eventuale presenza di valori duplicati.When a unique index exists, the Motore di databaseDatabase Engine checks for duplicate values each time data is added by a insert operations. Le operazioni di inserimento che generano valori di chiave duplicati vengono sottoposte a rollback e in Motore di databaseDatabase Engine viene visualizzato un messaggio di errore,Insert operations that would generate duplicate key values are rolled back, and the Motore di databaseDatabase Engine displays an error message. anche nel caso in cui l'operazione di inserimento interessi più righe e crei un solo valore duplicato.This is true even if the insert operation changes many rows but causes only one duplicate. Se si tenta di immettere dati per i quali è disponibile un indice univoco e la clausola IGNORE_DUP_KEY è impostata su ON, l'operazione ha esito negativo solo per le righe che violano l'indice UNIQUE.If an attempt is made to enter data for which there is a unique index and the IGNORE_DUP_KEY clause is set to ON, only the rows violating the UNIQUE index fail.

Indici partizionatiPartitioned Indexes

Gli indici partizionati vengono creati e gestiti in modo analogo alle tabelle partizionate, ma, come gli indici normali, vengono trattati come oggetti di database separati.Partitioned indexes are created and maintained in a similar manner to partitioned tables, but like ordinary indexes, they are handled as separate database objects. È possibile creare un indice partizionato per una tabella non partizionata, nonché creare un indice non partizionato per una tabella partizionata.You can have a partitioned index on a table that is not partitioned, and you can have a nonpartitioned index on a table that is partitioned.

Se si crea un indice per una tabella partizionata senza specificare un filegroup in cui inserirlo, l'indice verrà partizionato in modo identico alla tabella sottostante,If you are creating an index on a partitioned table, and do not specify a filegroup on which to place the index, the index is partitioned in the same manner as the underlying table. in quanto per impostazione predefinita gli indici vengono inseriti negli stessi filegroup delle tabelle sottostanti e, nel caso di una tabella partizionata, nello stesso schema di partizione con colonne di partizionamento identiche.This is because indexes, by default, are placed on the same filegroups as their underlying tables, and for a partitioned table in the same partition scheme that uses the same partitioning columns. Se usa lo stesso schema di partizione e la stessa colonna di partizionamento della tabella, l'indice viene allineato alla tabella.When the index uses the same partition scheme and partitioning column as the table, the index is aligned with the table.

Avviso

La creazione e la ricompilazione di indici non allineati per una tabella con oltre 1.000 partizioni sono possibili, ma non supportate.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Questo tipo di operazioni può causare riduzioni delle prestazioni e un eccessivo consumo della memoria.Doing so may cause degraded performance or excessive memory consumption during these operations. Quando il numero di partizioni supera 1.000, si consiglia di utilizzare solo indici allineati.We recommend using only aligned indexes when the number of partitions exceed 1,000.

Quando si partiziona un indice cluster non univoco, per impostazione predefinita nel Motore di databaseDatabase Engine vengono aggiunte tutte le colonne di partizionamento all'elenco di chiavi di indice cluster, se non sono già presenti.When partitioning a non-unique, clustered index, the Motore di databaseDatabase Engine by default adds any partitioning columns to the list of clustered index keys, if not already specified.

È possibile creare viste indicizzate per tabelle partizionate in modo analogo agli indici delle tabelle.Indexed views can be created on partitioned tables in the same manner as indexes on tables. Per altre informazioni sugli indici partizionati, vedere Tabelle e indici partizionati e Architettura e guida per la progettazione degli indici di SQL Server.For more information about partitioned indexes, see Partitioned Tables and Indexes and the SQL Server Index Architecture and Design Guide.

In SQL Server 2019 (15.x)SQL Server 2019 (15.x) le statistiche non vengono create analizzando tutte le righe nella tabella se viene creato o ricompilato un indice partizionato.In SQL Server 2019 (15.x)SQL Server 2019 (15.x), statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. Query Optimizer utilizza invece l'algoritmo di campionamento predefinito per generare statistiche.Instead, the query optimizer uses the default sampling algorithm to generate statistics. Per ottenere statistiche sugli indici partizionati analizzando tutte le righe nella tabella, usare CREATE STATISTICS o UPDATE STATISTICS con la clausola FULLSCAN.To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

Indici filtratiFiltered Indexes

Un indice filtrato è un indice non cluster ottimizzato, adatto per le query tramite cui viene selezionata una piccola percentuale di righe da una tabella.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. Utilizza un predicato del filtro per indicizzare una parte dei dati di una tabella.It uses a filter predicate to index a portion of the data in the table. Un indice filtrato progettato correttamente consente di migliorare le prestazioni di esecuzione delle query e di ridurre i costi di archiviazione e di manutenzione.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

Opzioni SET necessarie per gli indici filtratiRequired SET Options for Filtered Indexes

Le opzioni SET nella colonna Valore obbligatorio sono richieste ogni volta che si verifica una qualsiasi delle condizioni seguenti:The SET options in the Required Value column are required whenever any of the following conditions occur:

  • Viene creato un indice filtrato.Create a filtered index.

  • I dati di un indice filtrato vengono modificati tramite un'operazione INSERT, UPDATE, DELETE o MERGE.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.

  • L'indice filtrato viene usato da Query Optimizer per generare il piano di query.The filtered index is used by the query optimizer to produce the query plan.

    Opzioni SETSET options Valore richiestoRequired value Valore server predefinitoDefault server value PredefinitoDefault

    OLE DB e ODBC predefinitoOLE DB and ODBC value
    PredefinitoDefault

    DB-Library predefinitoDB-Library value
    ANSI_NULLSANSI_NULLS ONON ONON ATTIVAON OFFOFF
    ANSI_PADDINGANSI_PADDING ONON ONON ATTIVAON OFFOFF
    ANSI_WARNINGS*ANSI_WARNINGS* ONON ONON ATTIVAON OFFOFF
    ARITHABORTARITHABORT ONON ATTIVAON OFFOFF OFFOFF
    CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL ONON ONON ATTIVAON OFFOFF
    NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF OFFOFF OFFOFF OFFOFF
    QUOTED_IDENTIFIERQUOTED_IDENTIFIER ONON ONON ATTIVAON OFFOFF
    • Quando il livello di compatibilità del database è impostato su 90 o su un valore maggiore, l'impostazione di ANSI_WARNINGS su ON comporta anche l'impostazione implicita di ARITHABORT su ON.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Se il livello di compatibilità del database è impostato su 80 o su un valore inferiore, l'opzione ARITHABORT deve essere impostata su ON in modo esplicito.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

Se le opzioni SET non sono corrette, possono verificarsi le condizioni seguenti:If the SET options are incorrect, the following conditions can occur:

  • L'indice filtrato non viene creato.The filtered index is not created.
  • Motore di databaseDatabase Engine genera un errore ed esegue il rollback delle istruzioni INSERT, UPDATE, DELETE o MERGE tramite le quali vengono modificati i dati dell'indice.The Motore di databaseDatabase Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.
  • Query Optimizer non considera l'indice nel piano di esecuzione per le istruzioni Transact-SQL.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

Per altre informazioni sugli indici filtrati, vedere Creare indici filtrati e Architettura e guida per la progettazione degli indici di SQL Server.For more information about Filtered Indexes, see Create Filtered Indexes and the SQL Server Index Architecture and Design Guide.

Indici spazialiSpatial Indexes

Per informazioni sugli indici spaziali, vedere CREATE SPATIAL INDEX e Panoramica degli indici spaziali.For information about spatial indexes, see CREATE SPATIAL INDEX and Spatial Indexes Overview.

Indici XMLXML Indexes

Per informazioni sugli indici XML, vedere CREATE XML INDEX e Indici XML (SQL Server).For information about XML indexes see, CREATE XML INDEX and XML Indexes (SQL Server).

Dimensione della chiave di indiceIndex Key Size

La dimensione massima per una chiave di indice è 900 byte per un indice cluster e 1700 byte per un indice non cluster.The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. Prima di Database SQLSQL Database e SQL Server 2016 (13.x) il limite era sempre 900 byte. È possibile creare indici su colonne varchar che superano il limite di byte se i dati esistenti nelle colonne non superano tale limite quando l'indice viene creato. Le successive operazioni di inserimento o aggiornamento nelle colonne che determinano l'aumento della dimensione totale oltre il limite avranno tuttavia esito negativo.(Before Database SQLSQL Database and SQL Server 2016 (13.x) the limit was always 900 bytes.) Indexes on varchar columns that exceed the byte limit can be created if the existing data in the columns do not exceed the limit at the time the index is created; however, subsequent insert or update actions on the columns that cause the total size to be greater than the limit will fail. La chiave di indice di un indice cluster non può contenere colonne di tipo varchar con dati esistenti nell'unità di allocazione ROW_OVERFLOW_DATA.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. Se viene creato un indice cluster in una colonna varchar e i dati esistenti si trovano nell'unità di allocazione IN_ROW_DATA, le azioni di inserimento o aggiornamento successive eseguite nella colonna che comporterebbero lo spostamento dei dati all'esterno delle righe avranno esito negativo.If a clustered index is created on a varchar column and the existing data is in the IN_ROW_DATA allocation unit, subsequent insert or update actions on the column that would push the data off-row will fail.

Negli indici non cluster possono essere incluse colonne non chiave nel relativo livello foglia.Nonclustered indexes can include non-key columns in the leaf level of the index. Queste colonne non vengono considerate dal Motore di databaseDatabase Engine durante il calcolo della dimensione della chiave di indice.These columns are not considered by the Motore di databaseDatabase Engine when calculating the index key size . Per altre informazioni, vedere Creare indici con colonne incluse e Architettura e guida per la progettazione degli indici di SQL Server.For more information, see Create Indexes with Included Columns and the SQL Server Index Architecture and Design Guide.

Nota

Quando le tabelle vengono partizionate, le colonne della chiave di partizionamento vengono aggiunte all'indice dal Motore di databaseDatabase Engine, se non sono già presenti in un indice cluster non univoco.When tables are partitioned, if the partitioning key columns are not already present in a non-unique clustered index, they are added to the index by the Motore di databaseDatabase Engine. Le dimensioni combinate delle colonne indicizzate, senza le colonne incluse, più tutte le colonne di partizionamento aggiunte non possono superare 1800 byte in un indice cluster non univoco.The combined size of the indexed columns (not counting included columns), plus any added partitioning columns cannot exceed 1800 bytes in a non-unique clustered index.

Colonne calcolateComputed Columns

Gli indici possono essere creati su colonne calcolate.Indexes can be created on computed columns. Per le colonne calcolate è inoltre possibile impostare la proprietà PERSISTED.In addition, computed columns can have the property PERSISTED. Questo significa che Motore di databaseDatabase Engine archivia i valori calcolati nella tabella e li aggiorna quando vengono aggiornate altre colonne da cui dipende la colonna calcolata.This means that the Motore di databaseDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. Motore di databaseDatabase Engine utilizza questi valori persistenti quando crea un indice sulla colonna e quando viene fatto riferimento all'indice all'interno di una query.The Motore di databaseDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query.

Per indicizzare una colonna calcolata, è necessario che tale colonna sia deterministica e precisa.To index a computed column, the computed column must deterministic and precise. La proprietà PERSISTED consente tuttavia di espandere i tipi di colonne calcolate indicizzabili, includendo i tipi seguenti:However, using the PERSISTED property expands the type of indexable computed columns to include:

  • Colonne calcolate basate su funzioni Transact-SQLTransact-SQL e CLR e metodi con tipo CLR definito dall'utente contrassegnati come deterministici dall'utente.Computed columns based on Transact-SQLTransact-SQL and CLR functions and CLR user-defined type methods that are marked deterministic by the user.
  • Colonne calcolate basate su espressioni che sono deterministiche, secondo quanto definito in Motore di databaseDatabase Engine, ma imprecise.Computed columns based on expressions that are deterministic as defined by the Motore di databaseDatabase Engine but imprecise.

Le colonne calcolate persistenti richiedono l'impostazione delle seguenti opzioni SET come mostrato nella sezione precedente Opzioni SET necessarie per gli indici filtrati.Persisted computed columns require the following SET options to be set as shown in the previous section Required SET Options for Filtered Indexes.

Il vincolo UNIQUE o PRIMARY KEY può includere una colonna calcolata a condizione che vengano soddisfatte tutte le condizioni per l'indicizzazione.The UNIQUE or PRIMARY KEY constraint can contain a computed column as long as it satisfies all conditions for indexing. In particolare, la colonna calcolata deve essere deterministica e precisa oppure deterministica e persistente.Specifically, the computed column must be deterministic and precise or deterministic and persisted. Per altre informazioni sul determinismo, vedere Funzioni deterministiche e non deterministiche.For more information about determinism, see Deterministic and Nondeterministic Functions.

Le colonne calcolate derivate dai tipi di dati image, ntext, text, varchar(max) , nvarchar(max) , varbinary(max) e xml possono essere indicizzate come colonne chiave o colonne non chiave incluse purché il tipo di dati della colonna calcolata sia consentito come colonna chiave o colonna non chiave dell'indice.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be indexed either as a key or included non-key column as long as the computed column data type is allowable as an index key column or non-key column. Ad esempio, non è possibile creare un indice XML primario per una colonna xml calcolata.For example, you cannot create a primary XML index on a computed xml column. Se la dimensione della chiave di indice supera i 900 byte, viene visualizzato un messaggio di avviso.If the index key size exceeds 900 bytes, a warning message is displayed.

La creazione di un indice su una colonna calcolata può impedire l'esecuzione di un'operazione di inserimento o di aggiornamento che in precedenza veniva eseguita correttamente.Creating an index on a computed column may cause the failure of an insert or update operation that previously worked. Questo problema si può verificare quando la colonna calcolata genera un errore aritmetico.Such a failure may take place when the computed column results in arithmetic error. Nella tabella seguente, ad esempio, nonostante la colonna calcolata c generi un errore aritmetico, l'istruzione INSERT viene eseguita correttamente.For example, in the following table, although computed column c results in an arithmetic error, the INSERT statement works.

CREATE TABLE t1 (a INT, b INT, c AS a/b);
INSERT INTO t1 VALUES (1, 0);

Se invece, dopo la creazione della tabella, viene creato un indice sulla colonna calcolata c, la stessa istruzione INSERT avrà esito negativo.If, instead, after creating the table, you create an index on computed column c, the same INSERT statement will now fail.

CREATE TABLE t1 (a INT, b INT, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);

Per altre informazioni, vedere Indici per le colonne calcolate.For more information, see Indexes on Computed Columns.

Colonne incluse di indiciIncluded Columns in Indexes

È possibile aggiungere colonne non chiave, o incluse, al livello foglia di un indice non cluster per migliorare le prestazioni di esecuzione delle query tramite la copertura della query.Non-key columns, called included columns, can be added to the leaf level of a nonclustered index to improve query performance by covering the query. Questo significa che tutte le colonne a cui la query fa riferimento sono incluse nell'indice come colonne chiave o non chiave.That is, all columns referenced in the query are included in the index as either key or non-key columns. In questo modo, per individuare tutte le informazioni necessarie, in Query Optimizer verrà eseguita un'analisi dell'indice, senza necessità di accedere ai dati della tabella o dell'indice cluster.This allows the query optimizer to locate all the required information from an index scan; the table or clustered index data is not accessed. Per altre informazioni, vedere Creare indici con colonne incluse e Architettura e guida per la progettazione degli indici di SQL Server.For more information, see Create Indexes with Included Columns and the SQL Server Index Architecture and Design Guide.

Impostazione di opzioni per gli indiciSpecifying Index Options

In SQL Server 2005 (9.x)SQL Server 2005 (9.x) sono state introdotte nuove opzioni per gli indici ed è stata modificata la modalità di impostazione di tali opzioni.SQL Server 2005 (9.x)SQL Server 2005 (9.x) introduced new index options and also modifies the way in which options are specified. Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH option_name equivale a WITH ( <option_name> = ON ) .In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ). Quando si impostano opzioni per gli indici, è necessario rispettare le regole seguenti:When you set index options, the following rules apply:

  • Le nuove opzioni per gli indici possono essere specificate solo usando WITH (option_name = ON | OFF).New index options can only be specified by using WITH (option_name = ON | OFF).
  • Non è possibile specificare opzioni utilizzando in una stessa istruzione sia la sintassi compatibile con le versioni precedenti, sia la nuova sintassi.Options cannot be specified by using both the backward compatible and new syntax in the same statement. Se ad esempio si specifica WITH (DROP_EXISTING, ONLINE = ON), l'istruzione avrà esito negativo.For example, specifying WITH (DROP_EXISTING, ONLINE = ON) causes the statement to fail.
  • Quando si crea un indice XML le opzioni devono essere specificate usando WITH (option_name= ON | OFF).When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF).

Clausola DROP_EXISTINGDROP_EXISTING Clause

È possibile utilizzare la clausola DROP_EXISTING per ricompilare l'indice, aggiungere o eliminare colonne, modificare opzioni, modificare il tipo di ordinamento delle colonne oppure cambiare lo schema di partizione o il filegroup.You can use the DROP_EXISTING clause to rebuild the index, add or drop columns, modify options, modify column sort order, or change the partition scheme or filegroup.

Se l'indice applica un vincolo PRIMARY KEY o UNIQUE e la definizione dell'indice non viene modificata in alcun modo, l'indice verrà eliminato e ricreato mantenendo il vincolo esistente.If the index enforces a PRIMARY KEY or UNIQUE constraint and the index definition is not altered in any way, the index is dropped and re-created preserving the existing constraint. Se invece la definizione dell'indice viene modificata, l'istruzione avrà esito negativo.However, if the index definition is altered the statement fails. Per modificare la definizione di un vincolo PRIMARY KEY o UNIQUE, eliminare il vincolo e aggiungere un vincolo con la nuova definizione.To change the definition of a PRIMARY KEY or UNIQUE constraint, drop the constraint and add a constraint with the new definition.

La clausola DROP_EXISTING consente un miglioramento delle prestazioni quando viene ricreato un indice cluster, con un set di chiavi identico oppure diverso, per una tabella che include anche indici non cluster.DROP_EXISTING enhances performance when you re-create a clustered index, with either the same or different set of keys, on a table that also has nonclustered indexes. La clausola DROP_EXISTING sostituisce l'esecuzione di un'istruzione DROP INDEX sull'indice cluster precedente e quindi di un'istruzione CREATE INDEX per il nuovo indice cluster.DROP_EXISTING replaces the execution of a DROP INDEX statement on the old clustered index followed by the execution of a CREATE INDEX statement for the new clustered index. Gli indici non cluster vengono ricompilati una sola volta e poi solo in caso di modifica della relativa definizione.The nonclustered indexes are rebuilt once, and then only if the index definition has changed. La clausola DROP_EXISTING non ricompila gli indici non cluster quando la definizione dell'indice contiene gli stessi valori dell'indice originale relativi al nome di indice, alle colonne chiave e di partizione, all'attributo di univocità e al tipo di ordinamento.The DROP_EXISTING clause does not rebuild the nonclustered indexes when the index definition has the same index name, key and partition columns, uniqueness attribute, and sort order as the original index.

Indipendentemente dal fatto che gli indici non cluster vengano ricompilati o meno, rimangono sempre nei filegroup o negli schemi di partizione originali e utilizzano le funzioni di partizione originali.Whether the nonclustered indexes are rebuilt or not, they always remain in their original filegroups or partition schemes and use the original partition functions. Se un indice cluster viene ricompilato in un filegroup o in uno schema di partizione diverso, gli indici non cluster non vengono spostati in funzione della nuova posizione dell'indice cluster.If a clustered index is rebuilt to a different filegroup or partition scheme, the nonclustered indexes are not moved to coincide with the new location of the clustered index. Pertanto, anche gli indici non cluster in precedenza allineati con l'indice cluster potrebbero non essere più allineati.Therefore, even the nonclustered indexes previously aligned with the clustered index, they may no longer be aligned with it. Per altre informazioni sull'allineamento degli indici partizionati, vedere Tabelle e indici partizionati.For more information about partitioned index alignment, see Partitioned Tables and Indexes.

La clausola DROP_EXISTING non ripete l'ordinamento dei dati se vengono utilizzate le stesse colonne chiave indice nello stesso ordine e con lo stesso tipo di ordinamento crescente o decrescente, a meno che nell'istruzione dell'indice non venga specificato un indice non cluster e l'opzione ONLINE sia impostata su OFF.The DROP_EXISTING clause will not sort the data again if the same index key columns are used in the same order and with the same ascending or descending order, unless the index statement specifies a nonclustered index and the ONLINE option is set to OFF. Se l'indice cluster è disabilitato, l'operazione CREATE INDEX WITH DROP_EXISTING deve essere eseguita con l'opzione ONLINE impostata su OFF.If the clustered index is disabled, the CREATE INDEX WITH DROP_EXISTING operation must be performed with ONLINE set to OFF. Se un indice non cluster è disabilitato e non è associato a un indice cluster disabilitato, l'operazione CREATE INDEX WITH DROP_EXISTING può essere eseguita con l'opzione ONLINE impostata su OFF o ON.If a nonclustered index is disabled and is not associated with a disabled clustered index, the CREATE INDEX WITH DROP_EXISTING operation can be performed with ONLINE set to OFF or ON.

Nota

Quando vengono eliminati o ricompilati indici con un numero di extent pari o superiore a 128, tramite il Motore di databaseDatabase Engine vengono posticipate le effettive deallocazioni delle pagine e i blocchi associati fino al termine del commit della transazione.When indexes with 128 extents or more are dropped or rebuilt, the Motore di databaseDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

Opzione ONLINEONLINE Option

Per l'esecuzione di operazioni sugli indici online, è necessario attenersi alle indicazioni seguenti:The following guidelines apply for performing index operations online:

  • Non è possibile modificare, troncare o eliminare la tabella sottostante mentre è in corso un'operazione sull'indice online.The underlying table cannot be altered, truncated, or dropped while an online index operation is in process.
  • Durante l'operazione sull'indice lo spazio su disco necessario aumenta temporaneamente.Additional temporary disk space is required during the index operation.
  • È possibile eseguire operazioni online su indici partizionati e indici che contengono colonne calcolate persistenti o colonne incluse.Online operations can be performed on partitioned indexes and indexes that contain persisted computed columns, or included columns.

Per altre informazioni, vedere Perform Index Operations Online.For more information, see Perform Index Operations Online.

Operazioni sull'indice ripristinabiliResumable index operations

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

Per l'esecuzione di operazioni sull'indice ripristinabili, è necessario attenersi alle indicazioni seguenti:The following guidelines apply for resumable index operations:

  • La creazione dell'indice online viene specificata come ripristinabile usando l'opzione RESUMABLE = ON.Online index create is specified as resumable using the RESUMABLE = ON option.
  • L'opzione RESUMABLE non è persistente nei metadati per un determinato indice e si applica solo alla durata di un'istruzione DDL corrente.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. Per abilitare la funzione di ripristino, è necessario quindi che la clausola RESUMABLE = ON sia specificata in modo esplicito.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.
  • L'opzione MAX_DURATION è supportata solo per l'opzione RESUMABLE = ON.MAX_DURATION option is only supported for RESUMABLE = ON option.
  • L'opzione MAX_DURATION per RESUMABLE specifica l'intervallo di tempo per la compilazione di un indice.MAX_DURATION for RESUMABLE option specifies the time interval for an index being built. Trascorso questo tempo, la compilazione dell'indice viene sospesa oppure viene completata.Once this time is used the index build is either paused or it completes its execution. È l'utente a decidere quando riprendere la compilazione di un indice che è stata sospesa.User decides when a build for a paused index can be resumed. Il valore espresso in minuti in time per MAX_DURATION deve essere maggiore di 0 e minore o uguale a una settimana (7 * 24 * 60 = 10080 minuti).The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Una sospensione prolungata di un'operazione sull'indice può compromettere le prestazioni DML su una tabella specifica, nonché la capacità del disco del database poiché entrambi gli indici, quello originale e quello appena creato, richiedono spazio su disco e devono essere aggiornati durante le operazioni DML.Having a long pause for an index operation may impact the DML performance on a specific table as well as the database disk capacity since both indexes the original one and the newly created one require disk space and need to be updated during DML operations. Se l'opzione MAX_DURATION viene omessa, l'operazione sull'indice continuerà fino al suo completamento o fino a quando non si verificherà un errore.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
  • Per sospendere immediatamente l'operazione sull'indice, è possibile arrestare il comando in corso (CTRL+C) oppure eseguire il comando ALTER INDEX PAUSE o il comando KILL <session_id>.To pause immediately the index operation, you can stop (Ctrl-C) the ongoing command, execute the ALTER INDEX PAUSE command, or execute the KILL <session_id> command. Quando il comando viene sospeso, è possibile riprenderlo usando il comando ALTER INDEX.Once the command is paused, it can be resumed using ALTER INDEX command.
  • Eseguendo nuovamente l'istruzione CREATE INDEX originale per l'indice ripristinabile, un'operazione di creazione indice sospesa riprende automaticamente.Re-executing the original CREATE INDEX statement for resumable index, automatically resumes a paused index create operation.
  • L'opzione SORT_IN_TEMPDB = ON non è supportata per l'indice ripristinabile.The SORT_IN_TEMPDB = ON option is not supported for resumable index.
  • Il comando DDL con RESUMABLE = ON non può essere eseguito all'interno di una transazione esplicita (non può far parte del blocco BEGIN TRAN ... COMMIT).The DDL command with RESUMABLE = ON cannot be executed inside an explicit transaction (cannot be part of begin TRAN ... COMMIT block).
  • Per riprendere/interrompere la creazione o la ricompilazione di un indice, usare la sintassi T-SQL ALTER INDEXTo resume/abort an index create/rebuild, use the ALTER INDEX T-SQL syntax

Nota

Il comando DDL viene eseguito fin tanto che è completato, sospeso o non riuscito.The DDL command runs until it completes, pauses or fails. Nel caso in cui il comando sia sospeso, verrà generato un errore a indicare che l'operazione è stata sospesa e che la creazione dell'indice non è stata completata.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Altre informazioni sullo stato corrente dell'indice sono disponibili in sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Come in precedenza, in caso di errore verrà generato un errore.As before in case of a failure an error will be issued as well.

Per indicare che la creazione di un indice viene eseguita come operazione ripristinabile e per verificarne lo stato di esecuzione corrente, vedere index_resumable_operations.To indicate that an index create is executed as resumable operation and to check its current execution state, see sys.index_resumable_operations.

RisorseResources

Sono necessarie le risorse seguenti per un'operazione di creazione dell'indice online ripristinabile:The following resources are required for resumable online index create operation:

  • Uno spazio aggiuntivo necessario per mantenere l'indice compilato, incluso il tempo di sospensione dell'indiceAdditional space required to keep the index being built, including the time when index is being paused
  • Velocità effettiva superiore del log delle transazioni nella fase di ordinamento.Additional log throughput during the sorting phase. L'utilizzo complessivo dello spazio nel log delle transazioni è minore rispetto alla normale creazione di indici online e consente il troncamento del log durante questa operazione.The overall log space usage for resumable index is less compared to regular online index create and allows log truncation during this operation.
  • Uno stato DDL per impedire eventuali modifiche DDLA DDL state preventing any DDL modification
  • La pulizia fantasma è bloccata nell'indice della compilazione per la durata dell'operazione, sia in pausa che mentre l'operazione è in esecuzione.Ghost cleanup is blocked on the in-build index for the duration of the operation both while paused and while the operation is running.

Limitazioni funzionali attualiCurrent functional limitations

Le funzionalità seguenti sono disabilitate per le operazioni di creazione dell'indice ripristinabili:The following functionality is disabled for resumable index create operations:

  • Quando un'operazione di creazione dell'indice online ripristinabile è sospesa, il valore iniziale di MAXDOP non può essere modificatoAfter a resumable online index create operation is paused, the initial value of MAXDOP cannot be changed

  • Creare un indice che contenga:Create an index that contains:

    • Colonne calcolate o colonne TIMESTAMP come colonne chiaveComputed or TIMESTAMP column(s) as key columns
    • Colonna LOB come colonna inclusa per la creazione indice ripristinabileLOB column as included column for resumable index create
    • Indice filtratoFiltered index

Opzioni per blocchi di riga e di paginaRow and Page Locks Options

Se ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, i blocchi a livello di riga, pagina e tabella sono consentiti quando si accede all'indice.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-, page-, and table-level locks are allowed when accessing the index. Motore di databaseDatabase Engine sceglie il blocco appropriato e può eseguire un'escalation del blocco da un blocco di riga o di pagina a un blocco di tabella.The Motore di databaseDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Se ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, è consentito solo un blocco a livello di tabella quando si accede all'indice.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when accessing the index.

Chiavi sequenzialiSequential Keys

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

La contesa di inserimento dell'ultima pagina è un problema di prestazioni comune che si verifica quando un numero elevato di thread simultanei tenta di inserire righe in un indice con una chiave sequenziale.Last-page insert contention is a common performance problem that occurs when a large number of concurrent threads attempt to insert rows into an index with a sequential key. Un indice viene considerato sequenziale quando la colonna chiave iniziale contiene valori che sono sempre crescenti o decrescenti, ad esempio una colonna Identity o una data che per impostazione predefinita è la data/ora corrente.An index is considered sequential when the leading key column contains values that are always increasing (or decreasing), such as an identity column or a date that defaults to the current date/time. Poiché le chiavi da inserire sono sequenziali, tutte le nuove righe verranno inserite alla fine della struttura dell'indice (in altre parole, nella stessa pagina).Because the keys being inserted are sequential, all new rows will be inserted at the end of the index structure - in other words, on the same page. Questo comporta una contesa per la pagina in memoria, che si manifesta come diversi thread in attesa di PAGELATCH_EX per la pagina in questione.This leads to contention for the page in memory which can be observed as several threads waiting on PAGELATCH_EX for the page in question.

L'attivazione dell'opzione di indice OPTIMIZE_FOR_SEQUENTIAL_KEY abilita un'ottimizzazione all'interno del motore di database che contribuisce a migliorare la velocità effettiva per gli inserimenti nell'indice con un elevato grado di concorrenza.Turning on the OPTIMIZE_FOR_SEQUENTIAL_KEY index option enables an optimization within the database engine that helps improve throughput for high-concurrency inserts into the index. Questa opzione è destinata agli indici che dispongono di una chiave sequenziale e che pertanto sono soggetti a contesa di inserimento dell'ultima pagina, ma può essere utile anche per gli indici contenenti aree sensibili in altre aree della struttura dell'indice albero B.It is intended for indexes that have a sequential key and thus are prone to last-page insert contention, but it may also help with indexes that have hot spots in other areas of the B-Tree index structure.

Visualizzazione delle informazioni degli indiciViewing Index Information

Per ottenere informazioni sugli indici, è possibile utilizzare viste del catalogo, funzioni di sistema e stored procedure di sistema.To return information about indexes, you can use catalog views, system functions, and system stored procedures.

Compressione dei datiData Compression

La compressione dei dati è descritta nell'argomento Compressione dei dati.Data compression is described in the topic Data Compression. Di seguito sono illustrati i punti principali da considerare:The following are key points to consider:

  • La compressione può consentire di archiviare più righe in una pagina, ma non di modificare la dimensione massima della riga.Compression can allow more rows to be stored on a page, but does not change the maximum row size.
  • Alle pagine non foglia di un indice non può essere applicata la compressione a livello di pagina, ma può essere applicata la compressione a livello di riga.Non-leaf pages of an index are not page compressed but can be row compressed.
  • Ogni indice non cluster dispone di un'impostazione di compressione separata e non eredita l'impostazione di compressione della tabella sottostante.Each nonclustered index has an individual compression setting, and does not inherit the compression setting of the underlying table.
  • Quando un indice cluster viene creato in un heap, tale indice eredita lo stato di compressione dell'heap, a meno che non venga specificato uno stato di compressione alternativo.When a clustered index is created on a heap, the clustered index inherits the compression state of the heap unless an alternative compression state is specified.

Agli indici partizionati vengono applicate le restrizioni seguenti:The following restrictions apply to partitioned indexes:

  • Non è possibile modificare l'impostazione di compressione di una singola partizione se la tabella include indici non allineati.You cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • La sintassi ALTER INDEX <index> ... La sintassi REBUILD PARTITION ricompila la partizione specificata dell'indice.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • La sintassi ALTER INDEX <index> ... La sintassi REBUILD WITH ricompila tutte le partizioni dell'indice.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

Per valutare il modo in cui la modifica dello stato di compressione influirà su una tabella, un indice o una partizione, usare la stored procedure sp_estimate_data_compression_savings .To evaluate how changing the compression state will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

AutorizzazioniPermissions

È richiesta l'autorizzazione ALTER per la tabella o la vista.Requires ALTER permission on the table or view. L'utente deve essere un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_ddladmin e db_owner.User must be a member of the sysadmin fixed server role or the db_ddladmin or db_owner fixed database roles.

Limitazioni e restrizioniLimitations and Restrictions

In Azure Synapse AnalyticsAzure Synapse Analytics e Parallel Data WarehouseParallel Data Warehouse non è possibile creare:In Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse, you cannot create:

  • Un indice rowstore cluster o non cluster per una tabella di data warehouse se esiste già un indice columnstore.A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. Questo comportamento è diverso rispetto a SMP SQL ServerSQL Server, che consente la coesistenza di indici rowstore e columnstore nella stessa tabella.This behavior is different from SMP SQL ServerSQL Server which allows both rowstore and columnstore indexes to co-exist on the same table.
  • Non è possibile creare un indice per una vista.You cannot create an index on a view.

MetadatiMetadata

Per visualizzare informazioni sugli indici esistenti, è possibile eseguire una query sulla vista del catalogo sys.indexes.To view information on existing indexes, you can query the sys.indexes catalog view.

Note sulla versioneVersion Notes

Database SQLSQL Database non supporta le opzioni filegroup e FileStream.does not support filegroup and filestream options.

Esempi: tutte le versioni.Examples: All versions. Usa il database AdventureWorks.Uses the AdventureWorks database

R.A. Creare un indice rowstore non cluster sempliceCreate a simple nonclustered rowstore index

Negli esempi che seguono viene creato un indice non cluster per la colonna VendorID della tabella Purchasing.ProductVendor.The following examples create a nonclustered index on the VendorID column of the Purchasing.ProductVendor table.

CREATE INDEX IX_VendorID ON ProductVendor (VendorID);
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);

B.B. Creare un indice rowstore composto non cluster sempliceCreate a simple nonclustered rowstore composite index

Nell'esempio seguente viene creato un indice composto non cluster per le colonne SalesQuota e SalesYTD della tabella Sales.SalesPerson.The following example creates a nonclustered composite index on the SalesQuota and SalesYTD columns of the Sales.SalesPerson table.

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);

C.C. Creare un indice per una tabella in un altro databaseCreate an index on a table in another database

Nell'esempio seguente viene creato un indice cluster per la colonna VendorID della tabella ProductVendor nel database Purchasing.The following example creates a clustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);

D.D. Aggiungere una colonna a un indiceAdd a column to an index

Nell'esempio seguente viene creato l'indice IX_FF con due colonne della tabella dbo.FactFinance.The following example creates index IX_FF with two columns from the dbo.FactFinance table. L'istruzione successiva ricompila l'indice con un'ulteriore colonna e mantiene il nome esistente.The next statement rebuilds the index with one more column and keeps the existing name.

CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey ASC, DateKey ASC);

-- Rebuild and add the OrganizationKey
CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey, DateKey, OrganizationKey DESC)
  WITH (DROP_EXISTING = ON);

Esempi: SQL Server, database SQL di AzureExamples: SQL Server, Azure SQL Database

E.E. Creare un indice non cluster univocoCreate a unique nonclustered index

Nell'esempio seguente viene creato un indice non cluster univoco sulla colonna Name della tabella Production.UnitMeasure nel database AdventureWorks2012AdventureWorks2012.The following example creates a unique nonclustered index on the Name column of the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. Questo indice impone l'univocità dei dati inseriti nella colonna Name.The index will enforce uniqueness on the data inserted into the Name column.

CREATE UNIQUE INDEX AK_UnitMeasure_Name
  ON Production.UnitMeasure(Name);

Nella query seguente viene verificato il vincolo di univocità mediante un tentativo di inserimento di una riga con lo stesso valore di una riga esistente.The following query tests the uniqueness constraint by attempting to insert a row with the same value as that in an existing row.

-- Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
  VALUES ('OC', 'Ounces', GETDATE());

Il messaggio di errore risultante è:The resulting error message is:

Server: Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.

F.F. Uso dell'opzione IGNORE_DUP_KEYUse the IGNORE_DUP_KEY option

Nell'esempio seguente viene illustrato l'effetto dell'opzione IGNORE_DUP_KEY tramite l'inserimento di più righe in una tabella temporanea prima con questa opzione impostata su ON e quindi con questa opzione impostata su OFF.The following example demonstrates the effect of the IGNORE_DUP_KEY option by inserting multiple rows into a temporary table first with the option set to ON and again with the option set to OFF. Nella tabella #Test viene inserita una singola riga che genererà intenzionalmente un valore duplicato quando verrà eseguita la seconda istruzione INSERT su più righe.A single row is inserted into the #Test table that will intentionally cause a duplicate value when the second multiple-row INSERT statement is executed. Il calcolo delle righe della tabella restituisce il numero di righe inserite.A count of rows in the table returns the number of rows inserted.

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = ON);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

Di seguito sono riportati i risultati della seconda istruzione INSERT.Here are the results of the second INSERT statement.

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.

Number of rows
--------------
38

Si noti che le righe della tabella Production.UnitMeasure che non violano il vincolo di univocità sono state inserite correttamente.Notice that the rows inserted from the Production.UnitMeasure table that did not violate the uniqueness constraint were successfully inserted. Nonostante sia stato visualizzato un messaggio di avviso e sia stata ignorata la riga duplicata, non è stato eseguito un rollback dell'intera transazione.A warning was issued and the duplicate row ignored, but the entire transaction was not rolled back.

A questo punto vengono eseguite nuovamente le stesse istruzioni, ma l'opzione IGNORE_DUP_KEY è impostata su OFF.The same statements are executed again, but with IGNORE_DUP_KEY set to OFF.

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = OFF);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

Di seguito sono riportati i risultati della seconda istruzione INSERT.Here are the results of the second INSERT statement.

Server: Msg 2601, Level 14, State 1, Line 5
Cannot insert duplicate key row in object '#Test' with unique index
'AK_Index'. The statement has been terminated.

Number of rows
--------------
1

Si noti che nella tabella non è stata inserita alcuna riga della tabella Production.UnitMeasure, sebbene la violazione del vincolo dell'indice UNIQUE fosse determinata da una sola riga.Notice that none of the rows from the Production.UnitMeasure table were inserted into the table even though only one row in the table violated the UNIQUE index constraint.

G.G. Utilizzo di DROP_EXISTING per l'eliminazione e la ricreazione di un indiceUsing DROP_EXISTING to drop and re-create an index

Nell'esempio seguente viene eliminato e ricreato un indice esistente nella colonna ProductID della tabella Production.WorkOrder nel database AdventureWorks2012AdventureWorks2012 utilizzando l'opzione DROP_EXISTING.The following example drops and re-creates an existing index on the ProductID column of the Production.WorkOrder table in the AdventureWorks2012AdventureWorks2012 database by using the DROP_EXISTING option. Vengono inoltre impostate le opzioni FILLFACTOR e PAD_INDEX .The options FILLFACTOR and PAD_INDEX are also set.

CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
  ON Production.WorkOrder(ProductID)
    WITH (FILLFACTOR = 80,
      PAD_INDEX = ON,
      DROP_EXISTING = ON);
GO

H.H. Creare un indice per una vistaCreate an index on a view

Nell'esempio seguente vengono creati una vista e un indice per tale vista,The following example creates a view and an index on that view. quindi vengono eseguite due query in cui viene usata la vista indicizzata.Two queries are included that use the indexed view.

-- Set the options to support indexed views
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
  QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO

-- Create view with schemabinding
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
  DROP VIEW Sales.vOrders;
GO

CREATE VIEW Sales.vOrders
  WITH SCHEMABINDING
AS
  SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Revenue,
    OrderDate, ProductID, COUNT_BIG(*) AS COUNT
  FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
  WHERE od.SalesOrderID = o.SalesOrderID
  GROUP BY OrderDate, ProductID;
GO

-- Create an index on the view
CREATE UNIQUE CLUSTERED INDEX IDX_V1
  ON Sales.vOrders (OrderDate, ProductID);
GO

-- This query can use the indexed view even though the view is
-- not specified in the FROM clause.
SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev,
  OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND ProductID BETWEEN 700 AND 800
    AND OrderDate >= CONVERT(DATETIME, '05/01/2002', 101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO

-- This query can use the above indexed view
SELECT OrderDate, SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND DATEPART(mm, OrderDate) = 3
  AND DATEPART(yy, OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO

I.I. Creare un indice con colonne incluse (non chiave)Create an index with included (non-key) columns

Nell'esempio seguente viene creato un indice non cluster con una colonna chiave (PostalCode) e quattro colonne non chiave (AddressLine1, AddressLine2, City, StateProvinceID),The following example creates a nonclustered index with one key column (PostalCode) and four non-key columns (AddressLine1, AddressLine2, City, StateProvinceID). quindi viene eseguita una query che utilizza tale indice.A query that is covered by the index follows. Per visualizzare l'indice selezionato da Query Optimizer, nel menu Query di SQL Server Management StudioSQL Server Management Studio selezionare Includi piano di esecuzione effettivo prima di eseguire la query.To display the index that is selected by the query optimizer, on the Query menu in SQL Server Management StudioSQL Server Management Studio, select Display Actual Execution Plan before executing the query.

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
  ON Person.Address (PostalCode)
  INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO

J.J. Creare un indice partizionatoCreate a partitioned index

Nell'esempio seguente viene creato un indice partizionato non cluster nello schema di partizione esistente TransactionsPS1 nel database AdventureWorks2012AdventureWorks2012.The following example creates a nonclustered partitioned index on TransactionsPS1, an existing partition scheme in the AdventureWorks2012AdventureWorks2012 database. In questo esempio si presuppone che sia stato installato l'esempio di indice partizionato.This example assumes the partitioned index sample has been installed.

Si applica a: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 e versioni successive) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 and later) and database SQL di AzureAzure SQL Database

CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
  ON Production.TransactionHistory (ReferenceOrderID)
  ON TransactionsPS1 (TransactionDate);
GO

K.K. Creazione di un indice filtratoCreating a filtered index

Nell'esempio seguente viene creato un indice filtrato nella tabella Production.BillOfMaterials nel database AdventureWorks2012AdventureWorks2012.The following example creates a filtered index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. Il predicato del filtro può includere colonne che non sono colonne chiave nell'indice filtrato.The filter predicate can include columns that are not key columns in the filtered index. Il predicato in questo esempio consente di selezionare solo le righe in cui EndDate non ha un valore NULL.The predicate in this example selects only the rows where EndDate is non-NULL.

CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"
  ON Production.BillOfMaterials (ComponentID, StartDate)
  WHERE EndDate IS NOT NULL;

L.L. Creare un indice compressoCreate a compressed index

Nell'esempio seguente viene creato un indice in una tabella non partizionata utilizzando la compressione di riga.The following example creates an index on a nonpartitioned table by using row compression.

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
  WITH (DATA_COMPRESSION = ROW);
GO

Nell'esempio seguente viene creato un indice in una tabella partizionata utilizzando la compressione di riga in tutte le partizioni dell'indice.The following example creates an index on a partitioned table by using row compression on all partitions of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (DATA_COMPRESSION = ROW);
GO

Nell'esempio seguente viene creato un indice in una tabella partizionata utilizzando la compressione di pagina nella partizione 1 dell'indice e la compressione di riga nelle partizioni da 2 a 4 dell'indice.The following example creates an index on a partitioned table by using page compression on partition 1 of the index and row compression on partitions 2 through 4 of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (
    DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4)
  );
GO

M.M. Creare, riprendere, sospendere e interrompere operazioni sull'indice ripristinabiliCreate, resume, pause, and abort resumable index operations

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx1 ON test_table (col1) WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx2 ON test_table (col2) WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx1 ON test_table PAUSE;
ALTER INDEX test_idx2 ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx1 ON test_table RESUME;
ALTER INDEX test_idx2 ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx1 ON test_table ABORT;
ALTER INDEX test_idx2 ON test_table ABORT;

Esempi: Azure Synapse AnalyticsAzure Synapse Analytics e Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse

N.N. Sintassi di baseBasic syntax

Creare, riprendere, sospendere e interrompere operazioni sull'indice ripristinabiliCreate, resume, pause, and abort resumable index operations

Si applica a: SQL ServerSQL Server (a partire da SQL Server 2019 (15.x)SQL Server 2019 (15.x)) e database SQL di AzureAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and database SQL di AzureAzure SQL Database

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx ON test_table ABORT;

O.O. Creare un indice non cluster in una tabella nel database correnteCreate a nonclustered index on a table in the current database

Nell'esempio seguente viene creato un indice non cluster nella colonna VendorID della tabella ProductVendor.The following example creates a nonclustered index on the VendorID column of the ProductVendor table.

CREATE INDEX IX_ProductVendor_VendorID
  ON ProductVendor (VendorID);

P.P. Creare un indice cluster per una tabella in un altro databaseCreate a clustered index on a table in another database

Nell'esempio seguente viene creato un indice non cluster nella colonna VendorID della tabella ProductVendor nel database Purchasing.The following example creates a nonclustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID
  ON Purchasing..ProductVendor (VendorID);

Q.Q. Creare un indice cluster ordinato in una tabellaCreate an ordered clustered index on a table

L'esempio seguente crea un indice cluster ordinato nelle colonne c1 e c2 della tabella T1 nel database MyDB.The following example creates an ordered clustered index on the c1 and c2 columns of the T1 table in the MyDB database.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T1 
ORDER (c1, c2);

R.R. Convertire un indice columnstore cluster in un indice cluster ordinato in una tabellaConvert a CCI to an ordered clustered index on a table

L'esempio seguente converte l'indice columnstore cluster esistente in un indice columnstore cluster ordinato denominato MyOrderedCCI nelle colonne c1 e c2 della tabella T2 del database MyDB.The following example convert the existing clustered columnstore index to an ordered clustered columnstore index called MyOrderedCCI on the c1 and c2 columns of the T2 table in the MyDB database.

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T2
ORDER (c1, c2)
WITH (DROP_EXISTING = ON);

Vedere ancheSee Also

Architettura e guida per la progettazione degli indici di SQL Server SQL Server Index Architecture and Design Guide
Eseguire operazioni online sugli indiciPerform Index Operations Online
Indici e ALTER TABLE Indexes and ALTER TABLE
ALTER INDEX ALTER INDEX
CREATE PARTITION FUNCTION CREATE PARTITION FUNCTION
CREATE PARTITION SCHEME CREATE PARTITION SCHEME
CREATE SPATIAL INDEX CREATE SPATIAL INDEX
CREATE STATISTICS CREATE STATISTICS
CREATE TABLE CREATE TABLE
CREATE XML INDEX CREATE XML INDEX
Tipi di dati Data Types
DBCC SHOW_STATISTICS DBCC SHOW_STATISTICS
DROP INDEX DROP INDEX
Indici XML (SQL Server) XML Indexes (SQL Server)
sys.indexes sys.indexes
sys.index_columns sys.index_columns
sys.xml_indexes sys.xml_indexes
EVENTDATAEVENTDATA