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

ESTE TÓPICO APLICA-SE A: simSQL Server (a partir de 2008)simBanco de Dados SQL do Microsoft AzuresimAzure SQL Data Warehouse simParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Cria um índice relacional em uma tabela ou exibição.Creates a relational index on a table or view. Também chamado de um índice rowstore porque é um índice de árvore B clusterizado ou não clusterizado.Also called a rowstore index because it is either a clustered or nonclustered B-tree index. Você pode criar um índice rowstore antes que haja dados na tabela.You can create a rowstore index before there is data in the table. Use um índice rowstore para melhorar o desempenho de consulta, especialmente quando as consultas forem selecionadas de colunas específicas ou exigirem que os valores sejam classificados em uma ordem específica.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.

Observação

SQL Data WarehouseSQL Data Warehouse e Parallel Data WarehouseParallel Data Warehouse atualmente não são compatíveis com restrições Exclusivas. and Parallel Data WarehouseParallel Data Warehouse currently do not support Unique constraints. Quaisquer exemplos fazendo referência a Restrições Exclusivas são aplicáveis somente a SQL ServerSQL Server e Banco de Dados SQLSQL Database.Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and Banco de Dados SQLSQL Database.

Dica

Para obter informações sobre as diretrizes de design de índice, confira o Guia de design de índice do SQL Server.For information on index design guidelines, refer to the SQL Server Index Design Guide.

Exemplos simples: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);  

Principais cenários:Key scenarios:

  • Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x) e o Banco de Dados SQLSQL Database, use um índice não clusterizado em um índice columnstore para melhorar o desempenho da consulta de armazenamento de dados.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and Banco de Dados SQLSQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. Para obter mais informações, veja Índices Columnstore – data warehouse.For more information, see Columnstore Indexes - Data Warehouse.

Você precisa criar um tipo diferente de índice?Need to create a different type of index?

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

Sintaxe do SQL Server e do Banco de Dados SQL do 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 ] . | schema_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 | OF }
  | MAX_DURATION = <time> [MINUTES]
  | ALLOW_ROW_LOCKS = { ON | OFF }  
  | ALLOW_PAGE_LOCKS = { 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>  

Índice relacional compatível com versões anterioresBackward Compatible Relational Index

Importante

A estrutura de sintaxe de índice relacional compatível com versões anteriores será removida em uma versão futura do SQL ServerSQL Server.The backward compatible relational index syntax structure will be removed in a future version of SQL ServerSQL Server. Evite usar essa estrutura de sintaxe em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que a utilizam atualmente.Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. Use a estrutura de sintaxe especificada em <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   
}  

Sintaxe do SQL Data Warehouse do Azure e do Parallel Data WarehouseSyntax for Azure SQL Data Warehouse and Parallel Data Warehouse


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

ArgumentosArguments

UNIQUEUNIQUE
Cria um índice exclusivo em uma tabela ou exibição.Creates a unique index on a table or view. Um índice exclusivo é aquele no qual duas linhas não podem ter o mesmo valor de chave de índice.A unique index is one in which no two rows are permitted to have the same index key value. Um índice clusterizado em uma exibição deve ser exclusivo.A clustered index on a view must be unique.

O Mecanismo de Banco de DadosDatabase Engine não permite a criação de um índice exclusivo em colunas que já contêm valores duplicados, independentemente de IGNORE_DUP_KEY estar definido como ON.The Mecanismo de Banco de DadosDatabase 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 isso for tentado, o Mecanismo de Banco de DadosDatabase Engine exibirá uma mensagem de erro.If this is tried, the Mecanismo de Banco de DadosDatabase Engine displays an error message. Valores duplicados devem ser removidos para que um índice exclusivo possa ser criado em uma ou mais colunas.Duplicate values must be removed before a unique index can be created on the column or columns. As colunas usadas em um índice exclusivo devem ser definidas como NOT NULL, pois vários valores nulos serão considerados duplicatas quando um índice exclusivo for criado.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
Cria um índice no qual a ordem lógica dos valores de chave determina a ordem física das linhas correspondentes em uma tabela.Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. O nível inferior, ou folha, do índice clusterizado contém as linhas de dados reais da tabela.The bottom, or leaf, level of the clustered index contains the actual data rows of the table. Uma tabela ou exibição pode ter um índice clusterizado por vez.A table or view is allowed one clustered index at a time.

Uma exibição com um índice clusterizado exclusivo é chamada de exibição indexada.A view with a unique clustered index is called an indexed view. Criar um índice clusterizado exclusivo em uma exibição materializa fisicamente a exibição.Creating a unique clustered index on a view physically materializes the view. Um índice clusterizado exclusivo deve ser criado em uma exibição para que qualquer outro índice possa ser definido na mesma exibição.A unique clustered index must be created on a view before any other indexes can be defined on the same view. Para obter mais informações, veja Criar exibições indexadas.For more information, see Create Indexed Views.

Crie o índice clusterizado antes de criar quaisquer índices não clusterizados.Create the clustered index before creating any nonclustered indexes. Os índices não clusterizados existentes nas tabelas serão recriados quando um índice clusterizado for criado.Existing nonclustered indexes on tables are rebuilt when a clustered index is created.

Se CLUSTERED não for especificado, um índice não clusterizado será criado.If CLUSTERED is not specified, a nonclustered index is created.

Observação

Uma vez que o nível folha de um índice clusterizado e as páginas de dados são os mesmos por definição, criar um índice clusterizado e usar a cláusula ON partition_scheme_name ou ON filegroup_name efetivamente move uma tabela do grupo de arquivos em que a tabela foi criada para o novo esquema de partição ou grupo de arquivos.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. Antes de criar tabelas ou índices em grupos de arquivos específicos, verifique quais grupos de arquivos estão disponíveis e se eles têm espaço vazio suficiente para o índice.Before creating tables or indexes on specific filegroups, verify which filegroups are available and that they have enough empty space for the index.

Em alguns casos, criar um novo índice clusterizado pode habilitar índices previamente desabilitados.In some cases creating a clustered index can enable previously disabled indexes. Para obter mais informações, veja Habilitar índices e restrições e Desabilitar índices e restrições.For more information, see Enable Indexes and Constraints and Disable Indexes and Constraints.

NONCLUSTEREDNONCLUSTERED
Cria um índice que especifica a ordem lógica de uma tabela.Creates an index that specifies the logical ordering of a table. Com um índice não clusterizado, a ordem física das linhas de dados é independente de sua ordem indexada.With a nonclustered index, the physical order of the data rows is independent of their indexed order.

Cada tabela pode ter até 999 índices não clusterizados, independentemente de como eles são criados: seja implicitamente com as restrições PRIMARY KEY e UNIQUE ou explicitamente com 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.

Para exibições indexadas, os índices não clusterizados podem ser criados somente em uma exibição que tenha um índice clusterizado exclusivo já definido.For indexed views, nonclustered indexes can be created only on a view that has a unique clustered index already defined.

Se não for especificado de outra forma, o tipo de índice padrão será NONCLUSTERED.If not otherwise specified, the default index type is NONCLUSTERED.

index_nameindex_name
É o nome do índice.Is the name of the index. Os nomes de índice devem ser exclusivos em uma tabela ou exibição, mas não precisam ser exclusivos no banco de dados.Index names must be unique within a table or view but do not have to be unique within a database. Os nomes de índice precisam seguir as regras para identificadores.Index names must follow the rules of identifiers.

columncolumn
É a coluna, ou colunas, em que o índice se baseia.Is the column or columns on which the index is based. Especifique dois ou mais nomes de coluna para criar um índice composto com os valores combinados das colunas especificadas.Specify two or more column names to create a composite index on the combined values in the specified columns. Liste as colunas que serão incluídas no índice composto, em ordem de prioridade de classificação, entre parênteses depois de 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.

Até 32 colunas podem ser combinadas em uma única chave de índice composto.Up to 32 columns can be combined into a single composite index key. Todas as colunas de uma chave de índice composto devem estar na mesma tabela ou exibição.All the columns in a composite index key must be in the same table or view. O tamanho máximo permitido de valores de índice combinados é de 900 bytes para um índice clusterizado ou de 1.700 para um índice não clusterizado.The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. Os limites são 16 colunas e 900 bytes para versões anteriores ao Banco de Dados SQLSQL Database V12 e SQL Server 2016 (13.x)SQL Server 2016 (13.x).The limits are 16 columns and 900 bytes for versions before Banco de Dados SQLSQL Database V12 and SQL Server 2016 (13.x)SQL Server 2016 (13.x).

Colunas que são dos tipos de dados LOB (Objeto Grande) ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, ou image não podem ser especificadas como colunas chave para um índice.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. Além disso, uma definição de exibição não pode incluir colunas ntext, text ou image, mesmo que elas não sejam referenciadas na instrução CREATE INDEX.Also, a view definition cannot include ntext, text, or image columns, even if they are not referenced in the CREATE INDEX statement.

É possível criar índices em colunas do tipo CLR definido pelo usuário se o tipo der suporte à ordenação binária.You can create indexes on CLR user-defined type columns if the type supports binary ordering. Também é possível criar índices em colunas computadas definidas como invocações de método de uma coluna de tipo definido pelo usuário, desde que os métodos sejam marcados como determinísticos e não executem operações de acesso aos dados.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. Para obter mais informações sobre como indexar colunas CLR de tipo definido pelo usuário, veja Tipos CLR definidos pelo usuário.For more information about indexing CLR user-defined type columns, see CLR User-defined Types.

[ ASC | DESC ][ ASC | DESC ]
Determina a direção de classificação crescente ou decrescente da coluna de índice específica.Determines the ascending or descending sort direction for the particular index column. O padrão é ASC.The default is ASC.

INCLUDE (column [ ,... n ] )INCLUDE (column [ ,... n ] )
Especifica as colunas não chave a serem adicionadas ao nível folha do índice não clusterizado.Specifies the non-key columns to be added to the leaf level of the nonclustered index. O índice não clusterizado pode ser exclusivo ou não exclusivo.The nonclustered index can be unique or non-unique.

Os nomes de coluna não podem ser repetidos na lista INCLUDE e não podem ser usados simultaneamente como colunas de chave e não chave.Column names cannot be repeated in the INCLUDE list and cannot be used simultaneously as both key and non-key columns. Índices não clusterizados sempre conterão as colunas de índice clusterizado se um índice clusterizado for definido na tabela.Nonclustered indexes always contain the clustered index columns if a clustered index is defined on the table. Para obter mais informações, consulte Create Indexes with Included Columns.For more information, see Create Indexes with Included Columns.

São permitidos todos os tipos de dados, exceto text, ntexte image.All data types are allowed except text, ntext, and image. O índice deverá ser criado ou recriado offline (ONLINE = OFF) se qualquer uma das colunas não chave especificadas for dos tipos de dados varchar(max), nvarchar(max) ou 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.

As colunas computadas que são determinísticas e precisas ou imprecisas podem ser colunas incluídas.Computed columns that are deterministic and either precise or imprecise can be included columns. Colunas computadas derivadas dos tipos de dados image, ntext, text, varchar(max), nvarchar(max), varbinary(max) e xml podem ser incluídas em colunas não chave, desde que os tipos de dados da coluna computada sejam permitidos como uma coluna incluída.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. Para obter mais informações, consulte Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Para obter informações sobre como criar um índice XML, veja CREATE XML INDEX (Transact-SQL).For information on creating an XML index, see CREATE XML INDEX (Transact-SQL).

WHERE <filter_predicate> Cria um índice filtrado especificando quais linhas serão incluídas nele.WHERE <filter_predicate> Creates a filtered index by specifying which rows to include in the index. O índice filtrado deve ser um índice não clusterizado em uma tabela.The filtered index must be a nonclustered index on a table. Cria estatísticas filtradas para as linhas de dados no índice filtrado.Creates filtered statistics for the data rows in the filtered index.

O predicado de filtro usa a lógica de comparação simples e não pode fazer referência a uma coluna computada, a uma coluna UDT, a uma coluna de tipo de dados espacial ou a uma coluna de tipo de dados 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. Comparações que usam literais NULL não são permitidas com os operadores de comparação.Comparisons using NULL literals are not allowed with the comparison operators. Use os operadores IS NULL e IS NOT NULL em seu lugar.Use the IS NULL and IS NOT NULL operators instead.

Estes são alguns exemplos de predicados de filtro da tabela 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

    Índices filtrados não se aplicam a índices XML e índices de texto completo.Filtered indexes do not apply to XML indexes and full-text indexes. Para índices UNIQUE, somente as linhas selecionadas devem ter valores de índice exclusivo.For UNIQUE indexes, only the selected rows must have unique index values. Índices filtrados não permitem a opção 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 )
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica o esquema de partição que define os grupos de arquivos nos quais as partições de um índice particionado serão mapeadas.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index will be mapped. O esquema de partição deve existir no banco de dados com a execução de CREATE PARTITION SCHEME ou ALTER PARTITION SCHEME.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME. column_name especifica a coluna com relação à qual um índice particionado será particionado.column_name specifies the column against which a partitioned index will be partitioned. Essa coluna precisa corresponder ao tipo de dados, ao comprimento e à precisão do argumento da função de partição que partition_scheme_name está usando.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 não é restrito às colunas na definição de índice.column_name is not restricted to the columns in the index definition. Qualquer coluna da tabela base pode ser especificada, exceto que, ao particionar um índice UNIQUE, column_name deve ser escolhido entre aqueles usados como chave exclusiva.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. Essa restrição permite ao Mecanismo de Banco de DadosDatabase Engine verificar a exclusividade de valores de chave em uma única partição apenas.This restriction allows the Mecanismo de Banco de DadosDatabase Engine to verify uniqueness of key values within a single partition only.

Observação

Ao particionar um índice clusterizado não exclusivo, por padrão, o Mecanismo de Banco de DadosDatabase Engine adiciona a coluna de particionamento à lista de chaves de índices clusterizados, se ela já não estiver especificada.When you partition a non-unique, clustered index, the Mecanismo de Banco de DadosDatabase Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. Ao particionar um índice não clusterizado e não exclusivo, o Mecanismo de Banco de DadosDatabase Engine adiciona a coluna de particionamento como uma coluna não chave (incluída) do índice, se ela já não estiver especificada.When partitioning a non-unique, nonclustered index, the Mecanismo de Banco de DadosDatabase Engine adds the partitioning column as a non-key (included) column of the index, if it is not already specified.

Se partition_scheme_name ou filegroup não for especificado e a tabela estiver particionada, o índice será colocado no mesmo esquema de partição, usando a mesma coluna de particionamento que a tabela subjacente.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.

Observação

Não é possível especificar um esquema de particionamento em um índice XML.You cannot specify a partitioning scheme on an XML index. Se a tabela base for particionada, o índice XML usará o mesmo esquema de partição que a tabela.If the base table is partitioned, the XML index uses the same partition scheme as the table.

Para obter mais informações sobre particionamento de índices, consulte Tabelas e índices particionados.For more information about partitioning indexes, Partitioned Tables and Indexes.

ON filegroup_nameON filegroup_name
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Cria o índice especificado no grupo de arquivos especificado.Creates the specified index on the specified filegroup. Se nenhum local for especificado e a tabela ou exibição não for particionada, o índice usará o mesmo grupo de arquivos que a tabela ou exibição subjacente.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. O grupo de arquivos já deve existir.The filegroup must already exist.

ON " default "ON " default "
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Cria o índice especificado no grupo de arquivos padrão.Creates the specified index on the default filegroup.

Nesse contexto, default não é uma palavra-chave.The term default, in this context, is not a keyword. É um identificador do grupo de arquivos padrão e precisa ser delimitado, como em ON " default " ou ON [ default ].It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Se "padrão" for especificado, a opção QUOTED_IDENTIFIER deverá ser definida como ON para a sessão atual.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Essa é a configuração padrão.This is the default setting. Para obter mais informações, veja SET QUOTED_IDENTIFIER (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Especifica a colocação de dados FILESTREAM para a tabela quando um índice clusterizado é criado.Specifies the placement of FILESTREAM data for the table when a clustered index is created. A cláusula FILESTREAM_ON permite mover os dados FILESTREAM para outro grupo de arquivos ou esquema de partição FILESTREAM.The FILESTREAM_ON clause allows FILESTREAM data to be moved to a different FILESTREAM filegroup or partition scheme.

filestream_filegroup_name é o nome de um grupo de arquivos FILESTREAM.filestream_filegroup_name is the name of a FILESTREAM filegroup. O grupo de arquivos deve ter um arquivo definido para o grupo de arquivos usando uma instrução CREATE DATABASE ou ALTER DATABASE; caso contrário, será gerado um erro.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 a tabela for particionada, a cláusula FILESTREAM_ON deverá ser incluída e especificar um esquema de partição de grupo de arquivos FILESTREAM que use a mesma função de partição e colunas de partição que o esquema de partição da tabela.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. Caso contrário, será gerado um erro.Otherwise, an error is raised.

Se a tabela não estiver particionada, a coluna FILESTREAM não poderá ser particionada.If the table is not partitioned, the FILESTREAM column cannot be partitioned. Os dados FILESTREAM da tabela devem ser armazenados em um único grupo de arquivos que é especificado na cláusula FILESTREAM_ON.FILESTREAM data for the table must be stored in a single filegroup that is specified in the FILESTREAM_ON clause.

FILESTREAM_ON NULL poderá ser especificado em uma instrução CREATE INDEX se um índice clusterizado estiver sendo criado e a tabela não contiver uma coluna 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.

Para obter mais informações, veja FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

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

É o objeto totalmente qualificado ou não totalmente qualificado a ser indexado.Is the fully qualified or nonfully qualified object to be indexed.

database_namedatabase_name
É o nome do banco de dados.Is the name of the database.

schema_nameschema_name
É o nome do esquema ao qual a tabela ou exibição pertence.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
É o nome da tabela ou exibição que será indexada.Is the name of the table or view to be indexed.

A exibição deve ser definida com SCHEMABINDING para criar um índice nela.The view must be defined with SCHEMABINDING to create an index on it. Um índice clusterizado exclusivo deve ser criado em uma exibição antes que qualquer índice não clusterizado seja criado.A unique clustered index must be created on a view before any nonclustered index is created. Para obter mais informações sobre exibições indexadas, consulte a seção Comentários.For more information about indexed views, see the Remarks section.

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x), o objeto pode ser uma tabela armazenada com um índice columnstore clusterizado.Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the object can be a table stored with a clustered columnstore index.

O Banco de dados SQL do AzureAzure SQL Database dá suporte ao formato de nome de três partes database_name.[* schema_name ].object_name* quando o database_name é o banco de dados atual ou o database_name é tempdb e o object_name começa com #. Banco de dados SQL do AzureAzure SQL Database 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>::=

Especifica as opções a serem usadas ao criar o índice.Specifies the options to use when you create the index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica o preenchimento do índice.Specifies index padding. O padrão é OFF.The default is OFF.

ONON
O percentual de espaço livre especificado por fillfactor é aplicado às páginas de nível intermediário do índice.The percentage of free space that is specified by fillfactor is applied to the intermediate-level pages of the index.

OFF ou fillfactor não está especificadoOFF or fillfactor is not specified
As páginas de nível intermediário são preenchidas até próximo de sua capacidade, deixando espaço suficiente para pelo menos uma linha do tamanho máximo que o índice pode ter, considerando o conjunto de chaves em páginas intermediárias.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.

A opção PAD_INDEX só é útil quando FILLFACTOR é especificado, porque PAD_INDEX usa a porcentagem especificada por FILLFACTOR.The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. Se a porcentagem especificada para FILLFACTOR não for grande o suficiente para permitir uma linha, o Mecanismo de Banco de DadosDatabase Engine substituirá a porcentagem internamente para permitir o valor mínimo.If the percentage specified for FILLFACTOR is not large enough to allow for one row, the Mecanismo de Banco de DadosDatabase Engine internally overrides the percentage to allow for the minimum. O número de linhas em uma página de índice intermediária nunca é menor do que dois, independentemente de quão baixo seja o valor de fillfactor.The number of rows on an intermediate index page is never less than two, regardless of how low the value of fillfactor.

Na sintaxe compatível com versões anteriores, WITH PAD_INDEX é equivalente a WITH PAD_INDEX = ON.In backward compatible syntax, WITH PAD_INDEX is equivalent to WITH PAD_INDEX = ON.

FILLFACTOR =fillfactorFILLFACTOR =fillfactor
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica uma porcentagem que indica quanto o Mecanismo de Banco de DadosDatabase Engine deve preencher o nível folha de cada página de índice durante a criação ou recriação do índice.Specifies a percentage that indicates how full the Mecanismo de Banco de DadosDatabase Engine should make the leaf level of each index page during index creation or rebuild. fillfactor deve ser um valor inteiro de 1 a 100.fillfactor must be an integer value from 1 to 100. Se fillfactor for 100, o Mecanismo de Banco de DadosDatabase Engine criará índices com páginas de folha preenchidas até a capacidade total.If fillfactor is 100, the Mecanismo de Banco de DadosDatabase Engine creates indexes with leaf pages filled to capacity.

A configuração FILLFACTOR se aplica somente quando o índice é criado ou recriado.The FILLFACTOR setting applies only when the index is created or rebuilt. O Mecanismo de Banco de DadosDatabase Engine não mantém dinamicamente a porcentagem especificada de espaço vazio nas páginas.The Mecanismo de Banco de DadosDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Para exibir a configuração do fator de preenchimento, use a exibição do catálogo sys.indexes.To view the fill factor setting, use the sys.indexes catalog view.

Importante

A criação de um índice clusterizado com FILLFACTOR inferior a 100 afeta a quantidade de espaço de armazenamento ocupado pelos dados, porque o Mecanismo de Banco de DadosDatabase Engine redistribui os dados quando cria o índice clusterizado.Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the Mecanismo de Banco de DadosDatabase Engine redistributes the data when it creates the clustered index.

Para obter mais informações, veja Especificar fator de preenchimento para um índice.For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica se os resultados de classificação temporários devem ser armazenados no tempdb.Specifies whether to store temporary sort results in tempdb. O padrão é OFF.The default is OFF.

ONON
Os resultados de classificação intermediários usados para criar o índice são armazenados no tempdb.The intermediate sort results that are used to build the index are stored in tempdb. Isso poderá reduzir o tempo necessário para criar um índice se tempdb estiver em um conjunto de discos diferente do banco de dados de usuário.This may reduce the time required to create an index if tempdb is on a different set of disks than the user database. Entretanto, isso aumenta o espaço em disco usado durante a criação do índice.However, this increases the amount of disk space that is used during the index build.

OFFOFF
Os resultados intermediários de classificação são armazenados no mesmo banco de dados que o índice.The intermediate sort results are stored in the same database as the index.

Além do espaço necessário no banco de dados de usuário para criar o índice, tempdb deve ter aproximadamente a mesma quantidade de espaço adicional para conter os resultados de classificação intermediários.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. Para obter mais informações, consulte a Opção SORT_IN_TEMPDB para índices.For more information, see SORT_IN_TEMPDB Option For Indexes.

Na sintaxe compatível com versões anteriores, WITH SORT_IN_TEMPDB é equivalente 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 }
Especifica a resposta de erro quando uma operação de inserção tenta inserir valores da chave duplicada em um índice exclusivo.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. A opção IGNORE_DUP_KEY aplica-se apenas a operações de inserção depois que o índice é criado ou recriado.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. A opção não tem nenhum efeito ao executar CREATE INDEX, ALTER INDEX ou UPDATE.The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. O padrão é OFF.The default is OFF.

ONON
Uma mensagem de aviso será exibida quando valores de chave duplicados forem inseridos em um índice exclusivo.A warning message will occur when duplicate key values are inserted into a unique index. Ocorrerá falha somente nas linhas que violarem a restrição de exclusividade.Only the rows violating the uniqueness constraint will fail.

OFFOFF
Ocorrerá uma mensagem de erro quando os valores de chave duplicados forem inseridos em um índice exclusivo.An error message will occur when duplicate key values are inserted into a unique index. Toda a operação INSERT será revertida.The entire INSERT operation will be rolled back.

IGNORE_DUP_KEY não pode ser definido como ON para índices criados em uma exibição, índices não exclusivos, índices XML, índices espaciais e índices filtrados.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Para exibir IGNORE_DUP_KEY, use sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

Na sintaxe compatível com versões anteriores, WITH IGNORE_DUP_KEY é equivalente 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}
Especifica se as estatísticas de distribuição são recomputadas.Specifies whether distribution statistics are recomputed. O padrão é OFF.The default is OFF.

ONON
As estatísticas desatualizadas não são recalculadas automaticamente.Out-of-date statistics are not automatically recomputed.

OFFOFF
A atualização automática de estatísticas está habilitada.Automatic statistics updating are enabled.

Para restaurar a atualização automática de estatísticas, defina STATISTICS_NORECOMPUTE como OFF ou execute UPDATE STATISTICS sem a cláusula NORECOMPUTE.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

Importante

Se o recálculo automático de estatísticas de distribuição for desabilitado, o otimizador de consulta possivelmente ficará impedido de selecionar planos de execução ideais para consultas que envolvam a tabela.Disabling automatic recomputation of distribution statistics may prevent the query optimizer from picking optimal execution plans for queries involving the table.

Na sintaxe compatível com versões anteriores, WITH STATISTICS_NORECOMPUTE é equivalente 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 }
Quando estiver ON, as estatísticas serão criadas conforme as estatísticas de partição.When ON, the statistics created are per partition statistics. Quando estiver OFF, a árvore de estatísticas será removida e o SQL ServerSQL Server calculará as estatísticas novamente.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. O padrão é OFF.The default is OFF.

Se as estatísticas por partição não tiverem suporte, a opção será ignorada e um aviso será gerado.If per partition statistics are not supported the option is ignored and a warning is generated. As estatísticas incrementais não têm suporte para os seguintes tipos de estatísticas:Incremental stats are not supported for following statistics types:

  • Estatísticas criadas com os índices que não estejam alinhados por partição com a tabela base.Statistics created with indexes that are not partition-aligned with the base table.
  • Estatísticas criadas em bancos de dados secundários legíveis AlwaysOn.Statistics created on Always On readable secondary databases.
  • Estatísticas criadas em bancos de dados somente leitura.Statistics created on read-only databases.
  • Estatísticas criadas em índices filtrados.Statistics created on filtered indexes.
  • Estatísticas criadas em exibições.Statistics created on views.
  • Estatísticas criadas em tabelas internas.Statistics created on internal tables.
  • Estatísticas criadas com índices espaciais ou índices XML.Statistics created with spatial indexes or XML indexes.

DROP_EXISTING = { ON | OFF }DROP_EXISTING = { ON | OFF }
É uma opção para remover e recompilar o índice clusterizado ou não clusterizado existente com as especificações da coluna modificada e manter o mesmo nome para o índice.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. O padrão é OFF.The default is OFF.

ONON
Especifica remover e recompilar o índice existente, que deve ter o mesmo nome que o parâmetro index_name.Specifies to drop and rebuild the existing index, which must have the same name as the parameter index_name.

OFFOFF
Especifica não remover e recompilar o índice existente.Specifies not to drop and rebuild the existing index. O SQL Server exibirá um erro se o nome do índice especificado já existir.SQL Server displays an error if the specified index name already exists.

Com DROP_EXISTING, é possível alterar:With DROP_EXISTING, you can change:

  • Um índice rowstore não clusterizado para um índice rowstore clusterizado.A nonclustered rowstore index to a clustered rowstore index.

Com DROP_EXISTING, não é possível alterar:With DROP_EXISTING, you cannot change:

  • Um índice rowstore clusterizado para um índice rowstore não clusterizado.A clustered rowstore index to a nonclustered rowstore index.
  • Um índice columnstore clusterizado para qualquer tipo de índice de rowstore.A clustered columnstore index to any type of rowstore index.

Na sintaxe compatível com versões anteriores, WITH DROP_EXISTING é equivalente 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 }
Especifica se as tabelas subjacentes e os índices associados estão disponíveis para consultas e modificação de dados durante a operação de índice.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. O padrão é OFF.The default is OFF.

Observação

As operações de índice online não estão disponíveis em todas as edições do MicrosoftMicrosoft SQL ServerSQL Server.Online index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. Para obter uma lista de recursos com suporte nas edições do SQL ServerSQL Server, consulte Edições e recursos com suporte no 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
Bloqueios de tabela de longa duração não são mantidos durante a operação do índice.Long-term table locks are not held for the duration of the index operation. Durante a fase principal da operação de índice, apenas um bloqueio IS (Tentativa Compartilhada) é mantido na tabela de origem.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Ele permite o prosseguimento de consultas ou atualizações feitas na tabela e nos índices subjacentes.This enables queries or updates to the underlying table and indexes to proceed. No início da operação, um bloqueio Compartilhado (S) é mantido no objeto de origem por um período muito curto.At the start of the operation, a Shared (S) lock is held on the source object for a very short period of time. Ao término da operação, por um curto período de tempo, um bloqueio S (Compartilhado) será adquirido na origem se um índice não clusterizado estiver sendo criado; ou um bloqueio de modificação de esquema (SCH-M) será adquirido quando um índice clusterizado for criado ou descartado online e quando um índice clusterizado ou não clusterizado estiver sendo recriado.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. Não será possível definir ONLINE como ON quando um índice estiver sendo criado em uma tabela temporária local.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
Os bloqueios de tabela são aplicados enquanto durar a operação de índice.Table locks are applied for the duration of the index operation. Uma operação de índice offline que cria, recria ou cancela um índice clusterizado ou recria ou cancela um índice não clusterizado, adquire um bloqueio de esquema de modificação (Sch-M) na tabela.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. Isso evita o acesso de todos os usuários à tabela subjacente enquanto durar a operação.This prevents all user access to the underlying table for the duration of the operation. Uma operação de índice offline que cria um índice não clusterizado adquire um bloqueio Compartilhado (S) na tabela.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Isso impede atualizações na tabela subjacente, mas permite operações de leitura, como instruções SELECT.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Para obter mais informações, consulte Como funcionam as operações de índice online.For more information, see How Online Index Operations Work.

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

Aplica-se a: Banco de Dados SQLSQL Database como um recurso de visualização públicaApplies to: Banco de Dados SQLSQL Database as a public preview feature

Especifica se uma operação de índice online é retomável.Specifies whether an online index operation is resumable.

ON A operação do índice é retomável.ON Index operation is resumable.

OFF A operação do índice não é retomável.OFF Index operation is not resumable.

MAX_DURATION = time [MINUTES] usado com RESUMABLE = ON (requer ONLINE = ON).MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON).

Aplica-se a: Banco de Dados SQLSQL Database como um recurso de visualização públicaApplies to: Banco de Dados SQLSQL Database as a public preview feature

Indica o tempo (um valor inteiro especificado em minutos) pelo qual um uma operação de índice online retomável é executada antes de ser colocada em pausa.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

Aviso

Para obter mais informações sobre operações de índice que podem ser executadas online, consulte Diretrizes para operações de índice online.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Índices, inclusive os índices em tabelas temporárias globais, podem ser criados online com as seguintes exceções:Indexes, including indexes on global temp tables, can be created online with the following exceptions:

  • Índice XMLXML index
  • Índice em uma tabela temporária local.Index on a local temp table.
  • Índice clusterizado exclusivo inicial em uma exibição.Initial unique clustered index on a view.
  • Índices clusterizados desabilitados.Disabled clustered indexes.
  • Índice clusterizado se a tabela subjacente contiver tipos de dados LOB: image, ntext, text e tipos espaciais.Clustered index if the underlying table contains LOB data types: image, ntext, text, and spatial types.
  • As colunas varchar(max) e varbinary(max) não podem fazer parte de um índice.varchar(max) and varbinary(max) columns cannot be part of an index. Em SQL ServerSQL Server (começando com SQL Server 2012 (11.x)SQL Server 2012 (11.x)) e em Banco de Dados SQLSQL Database, quando uma tabela contém as colunas varchar(max) ou varbinary(max), um índice clusterizado contendo outras colunas pode ser criado ou recriado usando a opção ONLINE.In SQL ServerSQL Server (beginning with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and in Banco de Dados SQLSQL 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. Banco de Dados SQLSQL Database não permite a opção ONLINE quando a tabela base contém as colunas varchar(max) ou varbinary(max). does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns.

Para obter mais informações, consulte Perform Index Operations Online.For more information, see Perform Index Operations Online.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica se bloqueios de linha são permitidos.Specifies whether row locks are allowed. O padrão é ON.The default is ON.

ONON
Bloqueios de linha são permitidos ao acessar o índice.Row locks are allowed when accessing the index. O Mecanismo de Banco de DadosDatabase Engine determina quando os bloqueios de linha são usados.The Mecanismo de Banco de DadosDatabase Engine determines when row locks are used.

OFFOFF
Bloqueios de linha não são usados.Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica se bloqueios de página são permitidos.Specifies whether page locks are allowed. O padrão é ON.The default is ON.

ONON
Bloqueios de página são permitidos ao acessar o índice.Page locks are allowed when accessing the index. O Mecanismo de Banco de DadosDatabase Engine determina quando os bloqueios de página são usados.The Mecanismo de Banco de DadosDatabase Engine determines when page locks are used.

OFFOFF
Bloqueios de página não são usados.Page locks are not used.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Substitui a opção de configuração max degree of parallelism enquanto durar a operação do índice.Overrides the max degree of parallelism configuration option for the duration of the index operation. Para obter mais informações, veja Configurar a opção max degree of parallelism de configuração de servidor.For more information, see Configure the max degree of parallelism Server Configuration Option. Use MAXDOP para limitar o número de processadores usados em uma execução de plano paralelo.Use MAXDOP to limit the number of processors used in a parallel plan execution. O máximo é de 64 processadores.The maximum is 64 processors.

max_degree_of_parallelism pode ser:max_degree_of_parallelism can be:

11
Suprime a geração de plano paralelo.Suppresses parallel plan generation.

>1>1
Restringe o número máximo de processadores usados em uma operação de índice paralela ao número especificado, ou menos, com base na carga de trabalho atual do sistema.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 (padrão)0 (default)
Usa o número real de processadores, ou menos, com base na carga de trabalho atual do sistema.Uses the actual number of processors or fewer based on the current system workload.

Para obter mais informações, consulte Configurar operações de índice paralelo.For more information, see Configure Parallel Index Operations.

Observação

As operações de índice paralelas não estão disponíveis em todas as edições do MicrosoftMicrosoft SQL ServerSQL Server.Parallel index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. Para obter uma lista de recursos compatíveis com as edições do SQL ServerSQL Server, veja Edições e recursos compatíveis com SQL Server 2016 e Edições e recursos compatíveis com 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
Especifica a opção de compactação de dados para o índice, número de partição ou intervalo de partições especificado.Specifies the data compression option for the specified index, partition number, or range of partitions. As opções são as seguintes:The options are as follows:

NenhumaNONE
O índice ou as partições especificadas não são compactados.Index or specified partitions are not compressed.

ROWROW
O índice ou as partições especificadas são compactados com o uso da compactação de linha.Index or specified partitions are compressed by using row compression.

PAGEPAGE
O índice ou as partições especificadas são compactados com o uso da compactação de página.Index or specified partitions are compressed by using page compression.

Para obter mais informações sobre compactação, consulte Compactação de dados.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] ) ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

Especifica as partições às quais se aplica a configuração DATA_COMPRESSION.Specifies the partitions to which the DATA_COMPRESSION setting applies. Se o índice não for particionado, o argumento ON PARTITIONS irá gerar um erro.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Se a cláusula ON PARTITIONS não for fornecida, a opção DATA_COMPRESSION será aplicada a todas as partições de um índice particionado.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> pode ser especificado das seguintes maneiras:<partition_number_expression> can be specified in the following ways:

  • Forneça o número para uma partição, por exemplo: ON PARTITIONS (2).Provide the number for a partition, for example: ON PARTITIONS (2).
  • Forneça os números de várias partições individuais separados por vírgulas, por exemplo: ON PARTITIONS (1, 5).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • Forneça os intervalos e as partições individuais, por exemplo: ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions, for example: ON PARTITIONS (2, 4, 6 TO 8).

    <range> pode ser especificado como números de partição separados pela palavra TO, por exemplo: ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

    Para definir tipos diferentes de compactação de dados para partições diferentes, especifique a opção DATA_COMPRESSION mais de uma vez, por exemplo: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)  
);  

RemarksRemarks

A instrução CREATE INDEX é otimizada como qualquer outra consulta.The CREATE INDEX statement is optimized like any other query. Para salvar as operações de E/S, o processador de consultas pode optar por examinar outro índice em vez de executar um exame de tabela.To save on I/O operations, the query processor may choose to scan another index instead of performing a table scan. A operação de classificação pode ser eliminada em algumas situações.The sort operation may be eliminated in some situations. Em computadores com multiprocessadores, CREATE INDEX pode usar mais processadores para executar operações de exame e classificação associadas à criação do índice, exatamente como fazem outras consultas.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. Para obter mais informações, consulte Configurar operações de índice paralelo.For more information, see Configure Parallel Index Operations.

A operação de criação de índice poderá ser registrada minimamente se o modelo de recuperação de banco de dados for definido como bulk-logged ou simples.The create index operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

Os índices podem ser criados em uma tabela temporária.Indexes can be created on a temporary table. Quando a tabela for removida ou a sessão encerrada, os índices serão removidos.When the table is dropped or the session ends, the indexes are dropped.

Os índices dão suporte a propriedades estendidas.Indexes support extended properties.

Índices clusterizadosClustered Indexes

Criar um índice clusterizado em uma tabela (heap) ou descartar e recriar um índice clusterizado existente requer espaço de trabalho adicional disponível no banco de dados, para acomodar a classificação de dados e uma cópia temporária da tabela original ou dos dados do índice clusterizado existente.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. Para obter mais informações sobre índices clusterizados, veja Criar índices clusterizados.For more information about clustered indexes, see Create Clustered Indexes.

Índices não clusterizadosNonclustered Indexes

Começando com o SQL Server 2016 (13.x)SQL Server 2016 (13.x) e no Banco de dados SQL do AzureAzure SQL Database, você pode criar um índice não clusterizado em uma tabela armazenada como um índice columnstore clusterizado.Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in Banco de dados SQL do AzureAzure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. Se você primeiro criar um índice não clusterizado em uma tabela armazenada como um índice clusterizado ou heap, o índice persistirá se você depois converter a tabela em um índice columnstore clusterizado.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. Também não é necessário remover o índice não clusterizado ao recompilar o índice columnstore clusterizado.It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

Limitações e restrições:Limitations and Restrictions:

  • A opção FILESTREAM_ON é inválida quando você cria um índice não clusterizado em uma tabela armazenada como um índice columnstore clusterizado.The FILESTREAM_ON option is not valid when you create a nonclustered index on a table stored as a clustered columnstore index.

Índices exclusivosUnique Indexes

Quando existe um índice exclusivo, o Mecanismo de Banco de DadosDatabase Engine verifica se há valores duplicados sempre que dados são adicionados por operações de inserção.When a unique index exists, the Mecanismo de Banco de DadosDatabase Engine checks for duplicate values each time data is added by a insert operations. As operações de inserção que geram valores de chave duplicados são revertidas, e o Mecanismo de Banco de DadosDatabase Engine exibe uma mensagem de erro.Insert operations that would generate duplicate key values are rolled back, and the Mecanismo de Banco de DadosDatabase Engine displays an error message. Isso acontece mesmo que a operação de inserção altere muitas linhas, mas crie apenas uma duplicata.This is true even if the insert operation changes many rows but causes only one duplicate. Se for feita uma tentativa de inserir dados para os quais há um índice exclusivo e a cláusula IGNORE_DUP_KEY for definida como ON, somente as linhas que violarem o índice UNIQUE falharão.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.

Índices particionadosPartitioned Indexes

Índices particionados são criados e mantidos de uma maneira semelhante às tabelas particionadas, mas, como índices comuns, são tratados como objetos de banco de dados separados.Partitioned indexes are created and maintained in a similar manner to partitioned tables, but like ordinary indexes, they are handled as separate database objects. É possível haver um índice particionado em uma tabela não particionada, bem como é possível ter um índice não particionado em uma tabela particionada.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 você estiver criando um índice em uma tabela particionada e não especificar um grupo de arquivos para colocar o índice, ele será particionado da mesma maneira que a tabela subjacente.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. Isso ocorre porque, por padrão, os índices são colocados nos mesmos grupos de arquivos que suas tabelas subjacentes e, para uma tabela particionada, no mesmo esquema de partição que usa as mesmas colunas de particionamento.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. Quando o índice usa o mesmo esquema de partição e coluna de particionamento que a tabela, ele é alinhado à tabela.When the index uses the same partition scheme and partitioning column as the table, the index is aligned with the table.

Aviso

É possível criar e reconstruir índices não alinhados em uma tabela com mais de 1.000 partições, mas não há suporte para isso.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Fazer isso pode provocar degradação do desempenho ou consumo excessivo de memória durante essas operações.Doing so may cause degraded performance or excessive memory consumption during these operations. É recomendável usar índices alinhados apenas quando o número de partições for maior que 1.000.We recommend using only aligned indexes when the number of partitions exceed 1,000.

Ao particionar um índice clusterizado não exclusivo, por padrão, o Mecanismo de Banco de DadosDatabase Engine adiciona quaisquer colunas de particionamento à lista de chaves de índice clusterizado, se já não estiverem especificadas.When partitioning a non-unique, clustered index, the Mecanismo de Banco de DadosDatabase Engine by default adds any partitioning columns to the list of clustered index keys, if not already specified.

As exibições indexadas podem ser criadas em tabelas particionadas da mesma maneira que os índices em tabelas.Indexed views can be created on partitioned tables in the same manner as indexes on tables. Para obter mais informações sobre índices particionados, consulte Partitioned Tables and Indexes.For more information about partitioned indexes, see Partitioned Tables and Indexes.

No SQL Server 2017SQL Server 2017, as estatísticas não são criadas por meio do exame de todas as linhas da tabela quando um índice particionado é criado ou reconstruído.In SQL Server 2017SQL Server 2017, statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. Em vez disso, o otimizador de consultas usa o algoritmo de amostragem padrão para gerar estatísticas.Instead, the query optimizer uses the default sampling algorithm to generate statistics. Para obter estatísticas em índices particionados por meio do exame de todas as linhas da tabela, use CREATE STATISTICS ou UPDATE STATISTICS com a cláusula 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.

Índices filtradosFiltered Indexes

Índice filtrado é um índice não clusterizado otimizado, adequado a consultas que selecionam uma pequena porcentagem de linhas de uma tabela.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. Ele usa um predicado de filtro para indexar uma parte dos dados na tabela.It uses a filter predicate to index a portion of the data in the table. Um índice filtrado bem projetado pode melhorar o desempenho da consulta, além de reduzir custos de armazenamento e de manutenção.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

Opções SET necessárias para índices filtradosRequired SET Options for Filtered Indexes

As opções SET na coluna Valor necessário são necessárias sempre que ocorrer alguma das seguintes condições:The SET options in the Required Value column are required whenever any of the following conditions occur:

  • Criar um índice filtrado.Create a filtered index.
  • A operação INSERT, UPDATE, DELETE ou MERGE modificar os dados de um índice filtrado.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.
  • O índice filtrado é usado pelo otimizador de consulta para produzir o plano de consulta.The filtered index is used by the query optimizer to produce the query plan.

    Opções SetSET options Valor ObrigatórioRequired value Valor do servidor padrãoDefault server value PadrãoDefault

    Valor OLE DB e ODBCOLE DB and ODBC value
    PadrãoDefault

    Valor da DB-LibraryDB-Library value
    ANSI_NULLSANSI_NULLS ONON ONON ONON OFFOFF
    ANSI_PADDINGANSI_PADDING ONON ONON ONON OFFOFF
    ANSI_WARNINGS*ANSI_WARNINGS* ONON ONON ONON OFFOFF
    ARITHABORTARITHABORT ONON ONON OFFOFF OFFOFF
    CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL ONON ONON ONON OFFOFF
    NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF OFFOFF OFFOFF OFFOFF
    QUOTED_IDENTIFIERQUOTED_IDENTIFIER ONON ONON ONON OFFOFF

    *A definição de ANSI_WARNINGS como ON definirá ARITHABORT implicitamente como ON quando o nível de compatibilidade do banco de dados for definido como 90 ou mais.*Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Se o nível de compatibilidade do banco de dados estiver definido como 80 ou menos, a opção ARITHABORT deverá ser definida explicitamente como ON.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

    Se as opções SET estiverem incorretas, as seguintes condições poderão ocorrer:If the SET options are incorrect, the following conditions can occur:

  • O índice filtrado não é criado.The filtered index is not created.

  • O Mecanismo de Banco de DadosDatabase Engine gera um erro e reverte as instruções INSERT, UPDATE, DELETE ou MERGE que alteram os dados no índice.The Mecanismo de Banco de DadosDatabase Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.
  • O otimizador de consulta não considera o índice no plano de execução para qualquer instrução Transact-SQL.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

    Para obter mais informações sobre índices filtrados, consulte Criar índices filtrados.For more information about Filtered Indexes, see Create Filtered Indexes.

Índices espaciaisSpatial Indexes

Para obter informações sobre índices espaciais, veja CREATE SPATIAL INDEX (Transact-SQL) e Visão geral de índices espaciais.For information about spatial indexes, see CREATE SPATIAL INDEX (Transact-SQL) and Spatial Indexes Overview.

Índices XMLXML Indexes

Para informações sobre índices XML, veja CREATE XML INDEX (Transact-SQL) e Índices XML (SQL Server).For information about XML indexes see, CREATE XML INDEX (Transact-SQL) and XML Indexes (SQL Server).

Tamanho de chave de índiceIndex Key Size

O tamanho máximo para uma chave de índice é de 900 bytes para um índice clusterizado e de 1.700 bytes para um índice não clusterizado.The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. (Antes de Banco de Dados SQLSQL Database V12 e SQL Server 2016 (13.x)SQL Server 2016 (13.x) o limite foi sempre 900 bytes.) Os índices nas colunas varchar que excederem o limite de bytes poderão ser criados se os dados existentes nas colunas não excederem o limite bytes no momento da criação do índice; entretanto, as ações subsequentes de inserção ou atualização nas colunas que fazem com que o tamanho total seja maior que o limite de bytes falharão.(Before Banco de Dados SQLSQL Database V12 and SQL Server 2016 (13.x)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. A chave de um índice clusterizado não pode conter colunas varchar que tenham dados existentes na unidade de alocação 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 um índice clusterizado for criado em uma coluna varchar e os dados existentes estiverem na unidade de alocação IN_ROW_DATA, as ações subsequentes de inserção ou atualização na coluna que faria o push dos dados da linha apresentarão falha.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.

Índices não clusterizados podem incluir colunas não chave no nível folha do índice.Nonclustered indexes can include non-key columns in the leaf level of the index. Essas colunas não são consideradas pelo Mecanismo de Banco de DadosDatabase Engine ao calcular o tamanho da chave de índice.These columns are not considered by the Mecanismo de Banco de DadosDatabase Engine when calculating the index key size . Para obter mais informações, consulte Create Indexes with Included Columns.For more information, see Create Indexes with Included Columns.

Observação

Quando as tabelas são particionadas, se as colunas de chave de particionamento ainda não estiverem presentes em um índice clusterizado não exclusivo, elas poderão ser adicionadas ao índice pelo Mecanismo de Banco de DadosDatabase Engine.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 Mecanismo de Banco de DadosDatabase Engine. O tamanho combinado das colunas indexadas (sem contar as colunas incluídas) mais qualquer coluna de particionamento adicionada não pode exceder 1.800 bytes em um índice clusterizado não exclusivo.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.

Colunas computadasComputed Columns

Os índices podem ser criados em colunas computadas.Indexes can be created on computed columns. Além disso, as colunas computadas podem ter a propriedade PERSISTED.In addition, computed columns can have the property PERSISTED. Isso significa que o Mecanismo de Banco de DadosDatabase Engine armazena os valores computados na tabela e os atualiza quando as outras colunas das quais a coluna computada depende são atualizadas.This means that the Mecanismo de Banco de DadosDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. O Mecanismo de Banco de DadosDatabase Engine usa esses valores persistentes ao criar um índice na coluna e quando o índice é referenciado em uma consulta.The Mecanismo de Banco de DadosDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query.

Uma coluna computada deve ser determinística e precisa para ser indexada.To index a computed column, the computed column must deterministic and precise. Entretanto, o uso da propriedade PERSISTED expande o tipo das colunas computadas indexáveis para incluir:However, using the PERSISTED property expands the type of indexable computed columns to include:

  • Colunas computadas baseadas nas funções Transact-SQLTransact-SQL e CLR, e métodos de tipo CLR definidos pelo usuário que são marcados como determinísticos pelo usuário.Computed columns based on Transact-SQLTransact-SQL and CLR functions and CLR user-defined type methods that are marked deterministic by the user.
  • Colunas computadas baseadas em expressões que são determinísticas, conforme definidas pelo Mecanismo de Banco de DadosDatabase Engine, mas imprecisas.Computed columns based on expressions that are deterministic as defined by the Mecanismo de Banco de DadosDatabase Engine but imprecise.

    As colunas computadas persistentes requerem que as seguintes opções SET sejam definidas como mostrado na seção anterior "Opções SET necessárias para exibições indexadas".Persisted computed columns require the following SET options to be set as shown in the previous section "Required SET Options for Indexed Views".

    A restrição UNIQUE ou PRIMARY KEY pode conter uma coluna computada contanto que satisfaça todas as condições para indexação.The UNIQUE or PRIMARY KEY constraint can contain a computed column as long as it satisfies all conditions for indexing. Especificamente, a coluna computada deve ser determinística e precisa ou determinística e persistente.Specifically, the computed column must be deterministic and precise or deterministic and persisted. Para obter mais informações sobre determinismo de funções, veja Funções determinísticas e não determinísticas.For more information about determinism, see Deterministic and Nondeterministic Functions.

    Colunas computadas derivadas dos tipos de dados image, ntext, text, varchar(max), nvarchar(max), varbinary(max) e xml podem ser indexadas como coluna chave ou não chave incluída, desde que o tipo de dados da coluna computada seja permitido como uma coluna chave ou não chave de índice.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. Por exemplo, não é possível criar um índice XML primário em uma coluna xml computada.For example, you cannot create a primary XML index on a computed xml column. Se o tamanho da chave de índice exceder 900 bytes, uma mensagem de aviso será exibida.If the index key size exceeds 900 bytes, a warning message is displayed.

    Criar um índice em uma coluna computada pode causar a falha de uma operação de inserção ou atualização que tenha funcionado anteriormente.Creating an index on a computed column may cause the failure of an insert or update operation that previously worked. Essa falha pode ocorrer quando a coluna computada resultar em erro aritmético.Such a failure may take place when the computed column results in arithmetic error. Por exemplo, na tabela a seguir, embora a coluna computada c resulte em um erro aritmético, a instrução INSERT funciona.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, em vez disso, depois de criar a tabela, você criar um índice em uma coluna computada c, a mesma instrução INSERT agora falhará.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);  

Para obter mais informações, consulte Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Colunas incluídas em índicesIncluded Columns in Indexes

As colunas não chave, chamadas de colunas incluídas, podem ser adicionadas ao nível folha de um índice não clusterizado para melhorar o desempenho da consulta ao abrangê-la.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. Isso quer dizer que todas as colunas referenciadas na consulta são incluídas no índice como colunas de chave ou não chave.That is, all columns referenced in the query are included in the index as either key or non-key columns. Isso permite que o otimizador de consulta localize todas as informações necessárias de um exame de índice; os dados de tabela ou de índice clusterizado não são acessados.This allows the query optimizer to locate all the required information from an index scan; the table or clustered index data is not accessed. Para obter mais informações, consulte Create Indexes with Included Columns.For more information, see Create Indexes with Included Columns.

Especificando opções de índiceSpecifying Index Options

O SQL Server 2005SQL Server 2005 introduziu novas opções de índice e também modifica o modo como as opções são especificadas. SQL Server 2005SQL Server 2005 introduced new index options and also modifies the way in which options are specified. Na sintaxe compatível com versões anteriores, WITH option_name é equivalente a WITH ( <option_name> = ON ).In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ). Ao definir as opções de índice, aplicam-se as seguintes regras:When you set index options, the following rules apply:

  • Novas opções de índice só podem ser especificadas usando WITH (option_name = ON | OFF).New index options can only be specified by using WITH (option_name = ON | OFF).
  • As opções não podem ser especificadas com o uso de sintaxe compatível com versões anteriores e nova sintaxe na mesma instrução.Options cannot be specified by using both the backward compatible and new syntax in the same statement. Por exemplo, especificar WITH (DROP_EXISTING, ONLINE = ON) faz a instrução falhar.For example, specifying WITH (DROP_EXISTING, ONLINE = ON) causes the statement to fail.
  • Ao criar um índice XML, as opções devem ser especificadas usando WITH (option_name= ON | OFF).When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF).

Cláusula DROP_EXISTINGDROP_EXISTING Clause

É possível usar a cláusula DROP_EXISTING para recriar o índice, adicionar ou descartar colunas, modificar opções, modificar a ordem de classificação de colunas, ou alterar o esquema de partição ou o grupo de arquivos.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 o índice impuser uma restrição PRIMARY KEY ou UNIQUE e a definição de índice não for alterada de alguma maneira, o índice será descartado e recriado preservando a restrição existente.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. Entretanto, se a definição de índice for alterada, a instrução falhará.However, if the index definition is altered the statement fails. Para alterar a definição de uma restrição PRIMARY KEY ou UNIQUE, descarte a restrição e adicione uma restrição com a nova definição.To change the definition of a PRIMARY KEY or UNIQUE constraint, drop the constraint and add a constraint with the new definition.

DROP_EXISTING melhora o desempenho quando você recria um índice clusterizado, com o mesmo conjunto de chaves ou um conjunto diferente, em uma tabela que também tenha índices não clusterizados.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. DROP_EXISTING substitui a execução de uma instrução DROP_INDEX no índice clusterizado antigo, seguida da execução de uma instrução CREATE_INDEX para o novo índice clusterizado.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. Os índices não clusterizados são recriados uma vez e, depois disso, somente se a definição de índice for alterada.The nonclustered indexes are rebuilt once, and then only if the index definition has changed. A cláusula DROP_EXISTING não recria os índices não clusterizados quando a definição de índice tem o mesmo nome de índice, chave e colunas de partição, atributo de exclusividade e ordem de classificação que o índice original.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.

Os índices não clusterizados podem ser recriados ou não, mas sempre permanecem em seus grupos de arquivos ou esquemas de partição originais e usam as funções de partição originais.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 um índice clusterizado for recriado para um grupo de arquivos ou esquema de partição diferente, os índices não clusterizados não serão movidos para coincidir com o novo local do índice clusterizado.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. Portanto, mesmo os índices não clusterizados previamente alinhados ao índice clusterizado, podem não estar mais alinhados a ele.Therefore, even the nonclustered indexes previously aligned with the clustered index, they may no longer be aligned with it. Para obter mais informações sobre o alinhamento de índices particionados, consulte.For more information about partitioned index alignment, see.

A cláusula DROP_EXISTING não classificará os dados novamente se as mesmas colunas de chave de índice forem usadas na mesma ordem e com a mesma ordem crescente ou decrescente, a menos que a instrução de índice especifique um índice não clusterizado e a opção ONLINE seja definida como 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 o índice clusterizado for desabilitado, a operação CREATE INDEX WITH DROP_EXISTING deverá ser executada com ONLINE definido como OFF.If the clustered index is disabled, the CREATE INDEX WITH DROP_EXISTING operation must be performed with ONLINE set to OFF. Se um índice não clusterizado for desabilitado e não for associado a um índice clusterizado desabilitado, a operação CREATE INDEX WITH DROP_EXISTING poderá ser executada com ONLINE definido como OFF ou 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.

Quando índices com 128 extensões ou mais são descartados ou recriados, o Mecanismo de Banco de DadosDatabase Engine adia as desalocações de página atuais e seus bloqueios associados até depois da confirmação da transação.When indexes with 128 extents or more are dropped or rebuilt, the Mecanismo de Banco de DadosDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

Opção ONLINEONLINE Option

As diretrizes a seguir são aplicáveis ao executar operações de índice online:The following guidelines apply for performing index operations online:

  • A tabela subjacente não pode ser alterada, truncada ou descartada quando uma operação de índice online estiver em andamento.The underlying table cannot be altered, truncated, or dropped while an online index operation is in process.
  • É necessário espaço em disco temporário adicional durante a operação de índice.Additional temporary disk space is required during the index operation.
  • As operações online podem ser executadas em índices particionados e índices que contenham colunas computadas ou colunas incluídas persistentes.Online operations can be performed on partitioned indexes and indexes that contain persisted computed columns, or included columns.

    Para obter mais informações, consulte Perform Index Operations Online.For more information, see Perform Index Operations Online.

Operações de índice retomáveisResumable index operations

Aplica-se a: Banco de Dados SQLSQL Database como um recurso de visualização pública.Applies to: Banco de Dados SQLSQL Database as a public preview feature.

As diretrizes a seguir se aplicam a operações de índice retomável:The following guidelines apply for resumable index operations:

  • A criação de índice online é especificada como retomável usando a opção RESUMABLE = ON.Online index create is specified as resumable using the RESUMABLE = ON option.
  • A opção RESUMABLE não persiste nos metadados para um determinado índice e se aplica somente à duração de uma instrução DDL atual.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. Portanto, a cláusula RESUMABLE = ON deve ser especificada explicitamente para habilitar a capacidade de retomada.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.
  • Só há suporte para a opção MAX_DURATION para a opção RESUMABLE = ON.MAX_DURATION option is only supported for RESUMABLE = ON option.
  • A opção MAX_DURATION para RESUMABLE especifica o intervalo para um índice que está sendo recompilado.MAX_DURATION for RESUMABLE option specifies the time interval for an index being built. Depois que esse tempo é consumido, a recompilação de índice é colocada em pausa ou conclui sua execução.Once this time is used the index build is either paused or it completes its execution. O usuário decide quando uma recompilação de um índice em pausa pode ser retomada.User decides when a build for a paused index can be resumed. O time em minutos para MAX_DURATION deve ser maior que 0 minutos e menor ou igual uma semana (7 * 24 * 60 = 10.080 minutos).The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Ter uma longa pausa para uma operação de índice pode afetar o desempenho de DML em uma tabela específica, bem como a capacidade de disco de banco de dados, já que tanto o original quanto o recém-criado exigem espaço em disco e precisam ser atualizados durante as operações 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 a opção MAX_DURATION for omitida, a operação de índice continuará até sua conclusão ou até que ocorra uma falha.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
  • Para pausar imediatamente a operação de índice, você pode interromper (Ctrl-C) o comando em andamento, executar o comando ALTER INDEX PAUSE ou executar o 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. Depois que o comando for colocado em pausa, ele poderá ser retomado usando o comando ALTER INDEX.Once the command is paused, it can be resumed using ALTER INDEX command.
  • Executar novamente a instrução CREATE INDEX original para o índice retomável retoma automaticamente uma operação de criação de índice em pausa.Re-executing the original CREATE INDEX statement for resumable index, automatically resumes a paused index create operation.
  • A opção SORT_IN_TEMPDB=ON não é compatível com índice retomável.The SORT_IN_TEMPDB=ON option is not supported for resumable index.
  • O comando DDL com RESUMABLE=ON não pode ser executado em uma transação explícita (não pode fazer parte do bloco TRAN …The DDL command with RESUMABLE=ON cannot be executed inside an explicit transaction (cannot be part of begin TRAN … COMMIT).COMMIT block).
  • Para retomar/anular uma compilação/recriação de índice, use a sintaxe ALTER INDEX T-SQLTo resume/abort an index build/rebuild, use the ALTER INDEX T-SQL syntax

Observação

O comando DDL é executado até ser concluído, pausar ou falhar.The DDL command runs until it completes, pauses or fails. Caso o comando pause, será emitido um erro indicando que a operação foi colocada em pausa e que a criação de índice não foi concluída.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Para obter mais informações sobre o status atual do índice, veja sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Como antes, no caso de uma falha, um erro será emitido também.As before in case of a failure an error will be issued as well.

Para indicar que a criação de um índice é executada como uma operação retomável e para verificar seu estado de execução atual, confira sys.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. Para a visualização pública, as seguintes colunas nessa exibição são definidas como 0:For public preview, the following columns in this view are set to 0:

  • total_execution_timetotal_execution_time
  • percent_complete e page_countpercent_complete and page_count

Recursos Os recursos a seguir são necessários para a operação de criação de índice online retomávelResources The following resources are required for resumable online index create operation

  • Espaço adicional necessário para manter o índice que está sendo criado, incluindo o tempo em que o índice está em pausaAdditional space required to keep the index being built, including the time when index is being paused
  • Taxa de transferência de log adicional durante a fase de classificação.Additional log throughput during the sorting phase. O uso de espaço de log geral para índice retomável é menor em comparação com a criação de índice online regular e permite o truncamento de log durante a operação.The overall log space usage for resumable index is less compared to regular online index create and allows log truncation during this operation.
  • Um estado DDL que impede qualquer modificação de DDLA DDL state preventing any DDL modification
    • A limpeza de fantasma está bloqueada no índice no build pela duração da operação, em pausa e enquanto a operação está em execução.Ghost cleanup is blocked on the in-build index for the duration of the operation both while paused and while the operation is running.

Limitações funcionais atuaisCurrent functional limitations

Importante

Criação de Índice Online Retomável atualmente só tem suporte para o índice não clusterizado.Resumable Online Index Create is currently only supported for non-clustered index.

A seguinte funcionalidade está desabilitada para operações de criação de índice retomáveisThe following functionality is disabled for resumable index create operations

  • Não há suporte para a criação de índice retomável para um índice clusterizado para a visualização pública.Resumable Index Create is not supported for a clustered index for public preview.
  • Depois que uma operação de criação de índice online retomável é pausada, o valor inicial de MAXDOP não pode ser alteradoAfter a resumable online index create operation is paused, the initial value of MAXDOP cannot be changed
  • Não há suporte para a cláusula DROP EXISTINGDROP EXISTING clause is not supported
  • Criar um índice que contémCreate an index that contains
    • Coluna(s) calculada(s) ou TIMESTAMP como colunas de chaveComputed or TIMESTAMP column(s) as key columns
    • Coluna LOB como coluna incluída para criação de índice retomávelLOB column as included column for resumable index create
  • Índice filtradoFiltered index

Opções de bloqueios de linha e de páginaRow and Page Locks Options

Quando ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, os bloqueios em nível de linha, página e tabela são permitidos ao acessar o índice.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-, page-, and table-level locks are allowed when accessing the index. O Mecanismo de Banco de DadosDatabase Engine escolhe o bloqueio apropriado e pode escalar o bloqueio de uma linha ou página para um bloqueio de tabela.The Mecanismo de Banco de DadosDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Quando ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, somente um bloqueio em nível de tabela é permitido ao acessar o índice.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when accessing the index.

Exibindo informações de índiceViewing Index Information

Para retornar informações sobre índices, é possível usar exibições do catálogo, funções do sistema e procedimentos armazenados do sistema.To return information about indexes, you can use catalog views, system functions, and system stored procedures.

Data CompressionData Compression

Compactação de dados é descrita no tópico Compactação de dados.Data compression is described in the topic Data Compression. A seguir estão os pontos-chave a serem considerados:The following are key points to consider:

  • A compactação pode permitir que mais linhas sejam armazenadas em uma página, mas não altera o tamanho máximo da linha.Compression can allow more rows to be stored on a page, but does not change the maximum row size.
  • Páginas não folha de um índice não são compactadas por página, mas podem ser compactadas por linha.Non-leaf pages of an index are not page compressed but can be row compressed.
  • Cada índice não clusterizado tem uma configuração de compactação individual e não herda a configuração de compactação da tabela subjacente.Each nonclustered index has an individual compression setting, and does not inherit the compression setting of the underlying table.
  • Quando um índice clusterizado é criado em um heap, ele herda o estado de compactação do heap, a menos que um estado de compactação alternativo seja especificado.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.

    As restrições a seguir se aplicam a índices particionados:The following restrictions apply to partitioned indexes:

  • Não será possível alterar a configuração de compactação de uma única partição se a tabela tiver índices não alinhados.You cannot change the compression setting of a single partition if the table has nonaligned indexes.

  • O ALTER INDEX <index>... REBUILD PARTITION ... recria a partição especificada do índice.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • O ALTER INDEX <index>... REBUILD WITH... recria todas as partições do índice.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

    Para avaliar como a alteração do estado de compactação afetará uma tabela, um índice ou uma partição, use o procedimento armazenado 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.

PermissõesPermissions

Requer a permissão ALTER na tabela ou exibição.Requires ALTER permission on the table or view. O usuário deve ser membro da função de servidor fixa sysadmin ou das funções de banco de dados fixas db_ddladmin e db_owner .User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Limitações e restriçõesLimitations and Restrictions

SQL Data WarehouseSQL Data Warehouse e Parallel Data WarehouseParallel Data Warehouse, você não pode criar: and Parallel Data WarehouseParallel Data Warehouse, you cannot create:

  • Um índice rowstore clusterizado ou não clusterizado em uma tabela de data warehouse quando já existe um índice columnstore.A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. Esse comportamento é diferente do SMP SQL ServerSQL Server, o que permite aos índices rowstore e columnstore coexistir na mesma tabela.This behavior is different from SMP SQL ServerSQL Server which allows both rowstore and columnstore indexes to co-exist on the same table.
  • Você não pode criar um índice em uma exibição.You cannot create an index on a view.

MetadadosMetadata

Para exibir informações sobre índices existentes, você pode consultar a exibição do catálogo sys.indexes (Transact-SQL).To view information on existing indexes, you can query the sys.indexes (Transact-SQL) catalog view.

Notas de versãoVersion Notes

Banco de Dados SQLSQL Database não é compatível com as opções grupo de arquivos e fluxo de arquivos. does not support filegroup and filestream options.

Exemplos: todas as versões.Examples: All versions. Usa o banco de dados AdventureWorks.Uses the AdventureWorks database.

A.A. Criar um índice rowstore não clusterizado simplesCreate a simple nonclustered rowstore index

Os exemplos a seguir criam um índice não clusterizado na coluna VendorID da tabela 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. Criar um índice composto rowstore não clusterizado simplesCreate a simple nonclustered rowstore composite index

O exemplo a seguir cria um índice composto não clusterizado nas colunas SalesQuota e SalesYTD da tabela 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. Criar um índice em uma tabela em outro banco de dadosCreate an index on a table in another database

O exemplo a seguir cria um índice não clusterizado na coluna VendorID da tabela ProductVendor no banco de dados Purchasing.The following example creates a non-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. Adicionar uma coluna a um índiceAdd a column to an index

O exemplo a seguir cria o índice IX_FF com duas colunas da tabela dbo.FactFinance.The following example creates index IX_FF with two columns from the dbo.FactFinance table. A próxima instrução recompila o índice com mais uma coluna e mantém o nome existente.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 );  

Exemplos: SQL Server, Banco de Dados SQL do AzureExamples: SQL Server, Azure SQL Database

E.E. Criando um índice não clusterizado exclusivoCreate a unique nonclustered index

O exemplo a seguir cria um índice não clusterizado exclusivo na coluna Name da tabela Production.UnitMeasure no banco de dados AdventureWorks2012AdventureWorks2012.The following example creates a unique nonclustered index on the Name column of the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. O índice imporá a exclusividade dos dados inseridos na coluna Name.The index will enforce uniqueness on the data inserted into the Name column.

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

A consulta a seguir testa a restrição de exclusividade tentando inserir uma linha com o mesmo valor que o de uma linha existente.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());  

A mensagem de erro resultante é: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. Use a opção IGNORE_DUP_KEYUse the IGNORE_DUP_KEY option

O exemplo a seguir demonstra o efeito da opção IGNORE_DUP_KEY inserindo várias linhas em uma tabela temporária primeiro com a opção definida como ON e, em seguida, com a opção definida como 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. Uma única linha é inserida na tabela #Test, causando intencionalmente um valor duplicado quando a segunda instrução de várias linhas INSERT for executada.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. Uma contagem de linhas na tabela retorna o número de linhas inseridas.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  

A seguir são apresentados os resultados da segunda instrução 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  

Observe que as linhas inseridas da tabela Production.UnitMeasure que não violaram a restrição de exclusividade foram inseridas com êxito.Notice that the rows inserted from the Production.UnitMeasure table that did not violate the uniqueness constraint were successfully inserted. Um aviso foi emitido e a linha duplicada ignorada, mas a transação inteira não foi revertida.A warning was issued and the duplicate row ignored, but the entire transaction was not rolled back.

As mesmas instruções são executadas novamente, mas com IGNORE_DUP_KEY definido como 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  

A seguir são apresentados os resultados da segunda instrução 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  

Observe que nenhuma linha da tabela Production.UnitMeasure foi inserida na tabela, embora somente uma linha violasse a restrição de índice UNIQUE.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. Usando DROP_EXISTING para descartar e recriar um índiceUsing DROP_EXISTING to drop and re-create an index

O exemplo a seguir remove e recria um índice existente na coluna ProductID da tabela Production.WorkOrder no banco de dados AdventureWorks2012AdventureWorks2012 usando a opção 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. As opções FILLFACTOR e PAD_INDEX também são definidas.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. Criar um índice em um modo de exibiçãoCreate an index on a view

O exemplo a seguir cria uma exibição e um índice nessa exibição.The following example creates a view and an index on that view. Duas consultas que usam a exibição indexada são incluídas.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. Criando um índice com colunas incluídas (não chave)Create an index with included (non-key) columns

O exemplo a seguir cria um índice não clusterizado com uma coluna de chave (PostalCode) e quatro colunas não chave (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). Uma consulta incluída pelo índice vem em seguida.A query that is covered by the index follows. Para exibir o índice que é selecionado pelo otimizador de consulta, no menu Consulta no SQL Server Management StudioSQL Server Management Studio, selecione Exibir Plano de Execução Real antes de executar a consulta.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. Criar um índice particionadoCreate a partitioned index

O exemplo a seguir cria um índice particionado não clusterizado em TransactionsPS1, um esquema de partição existente no banco de dados AdventureWorks2012AdventureWorks2012.The following example creates a nonclustered partitioned index on TransactionsPS1, an existing partition scheme in the AdventureWorks2012AdventureWorks2012 database. Este exemplo pressupõe que o exemplo de índice particionado tenha sido instalado.This example assumes the partitioned index sample has been installed.

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

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

K.K. Criando um índice filtradoCreating a filtered index

O exemplo a seguir cria um índice filtrado na tabela Production.BillOfMaterials do banco de dados AdventureWorks2012AdventureWorks2012.The following example creates a filtered index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. O predicado de filtro pode incluir colunas que não sejam de chave no índice filtrado.The filter predicate can include columns that are not key columns in the filtered index. O predicado deste exemplo seleciona apenas as linhas em que EndDate é não 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. Criar um índice compactadoCreate a compressed index

O exemplo a seguir cria um índice em uma tabela não particionada usando a compactação de linha.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  

O exemplo a seguir cria um índice em uma tabela particionada usando a compactação de linha em todas as partições do índice.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  

O exemplo a seguir cria um índice em uma tabela particionada usando a compactação de página na partição 1 do índice e a compactação de linha nas partições 2 a 4 do índice.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. Criar, retomar, pausar e anular operações de índice retomávelCreate, resume, pause, and abort resumable index operations

-- 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 resumbale 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 

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

N.N. Sintaxe básicaBasic syntax

Criar, retomar, pausar e anular operações de índice retomávelCreate, resume, pause, and abort resumable index operations

-- 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 resumbale 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 

```sql  
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);  

O.O. Criar um índice não clusterizado em uma tabela no banco de dados atualCreate a non-clustered index on a table in the current database

O exemplo a seguir cria um índice não clusterizado na coluna VendorID da tabela ProductVendor.The following example creates a non-clustered index on the VendorID column of the ProductVendor table.

CREATE INDEX IX_ProductVendor_VendorID   
    ON ProductVendor (VendorID);   

P.P. Criar um índice clusterizado em uma tabela em outro banco de dadosCreate a clustered index on a table in another database

O exemplo a seguir cria um índice não clusterizado na coluna VendorID da tabela ProductVendor no banco de dados Purchasing.The following example creates a non-clustered index on the VendorID column of the ProductVendor table in the Purchasing database.

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

Consulte TambémSee Also

Guia de criação de índice do SQL Server SQL Server Index Design Guide
Índices e ALTER TABLE Indexes and ALTER TABLE
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
CREATE PARTITION FUNCTION (Transact-SQL) CREATE PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
CREATE SPATIAL INDEX (Transact-SQL) CREATE SPATIAL INDEX (Transact-SQL)
CREATE STATISTICS (Transact-SQL) CREATE STATISTICS (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE XML INDEX (Transact-SQL) CREATE XML INDEX (Transact-SQL)
Tipos de dados (Transact-SQL) Data Types (Transact-SQL)
DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
DROP INDEX (Transact-SQL) DROP INDEX (Transact-SQL)
Índices XML (SQL Server) XML Indexes (SQL Server)
sys.indexes (Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns (Transact-SQL) sys.index_columns (Transact-SQL)
sys.xml_indexes (Transact-SQL) sys.xml_indexes (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)