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

S’APPLIQUE À : ouiSQL Server (à partir de 2008) ouiAzure SQL Database ouiAzure SQL Data Warehouse ouiParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Crée un index relationnel sur une table ou une vue.Creates a relational index on a table or view. Également appelé index rowstore, car il s’agit d’un index B-Tree cluster ou non-cluster.Also called a rowstore index because it is either a clustered or nonclustered B-tree index. Vous pouvez créer un index rowstore avant que la table soit remplie de données.You can create a rowstore index before there is data in the table. Utilisez un index rowstore pour améliorer les performances des requêtes, en particulier quand les requêtes effectuent une sélection dans des colonnes spécifiques ou qu’elles exigent que les valeurs soient triées dans un ordre particulier.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.

Notes

SQL Data WarehouseSQL Data Warehouse et Parallel Data WarehouseParallel Data Warehouse ne prennent actuellement pas en charge les contraintes Unique.and Parallel Data WarehouseParallel Data Warehouse currently do not support Unique constraints. Les exemples faisant référence à des contraintes Unique sont applicables uniquement à SQL ServerSQL Server et à SQL DatabaseSQL Database.Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and SQL DatabaseSQL Database.

Conseil

Pour obtenir des informations sur les règles de conception d’index, consultez le Guide de conception d’index SQL Server.For information on index design guidelines, refer to the SQL Server Index Design Guide.

Exemples 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);

Scénario clé :Key scenario:

Depuis SQL Server 2016 (13.x)SQL Server 2016 (13.x) et SQL DatabaseSQL Database, utilisez un index non-cluster sur un index columnstore pour améliorer les performances des requêtes d’entreposage de données.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and SQL DatabaseSQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. Pour plus d’informations, consultez Index columnstore - Entrepôt de données.For more information, see Columnstore Indexes - Data Warehouse.

Pour d’autres types d’index, consultez :For additional types of indexes, see:

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

Syntaxe pour SQL Server et Azure SQL DatabaseSyntax for SQL Server and Azure SQL Database

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

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON | OFF }
  | RESUMABLE = {ON | 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>

Index relationnel à compatibilité descendanteBackward Compatible Relational Index

Important

La structure de la syntaxe de l’index relationnel à compatibilité descendante sera supprimée dans une future version de SQL ServerSQL Server.The backward compatible relational index syntax structure will be removed in a future version of SQL ServerSQL Server. Évitez d'utiliser cette structure de syntaxe dans tout nouveau travail de développement et envisagez de modifier les applications qui l'utilisent actuellement.Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. Utilisez la structure de syntaxe spécifiée dans <relational_index_option> à la place.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
}

Syntaxe pour Azure SQL Data Warehouse et 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 } )
[;]

ArgumentsArguments

UNIQUE Crée un index unique sur une table ou une vue.UNIQUE Creates a unique index on a table or view. Un index unique est un index dans lequel deux lignes ne peuvent pas avoir la même valeur de clé d'index.A unique index is one in which no two rows are permitted to have the same index key value. Un index cluster d'une vue doit être unique.A clustered index on a view must be unique.

Le Moteur de base de donnéesDatabase Engine ne permet pas de créer un index unique sur des colonnes qui contiennent déjà des valeurs dupliquées, qu'IGNORE_DUP_KEY soit ou non activé (ON).The Moteur de base de donnéesDatabase 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. Si vous tentez de le faire, le Moteur de base de donnéesDatabase Engine affiche un message d'erreur.If this is tried, the Moteur de base de donnéesDatabase Engine displays an error message. Les valeurs dupliquées doivent être supprimées pour qu'un index unique puisse être créé sur la ou les colonnes.Duplicate values must be removed before a unique index can be created on the column or columns. Les colonnes utilisées dans un index unique doivent être définies avec la valeur NOT NULL, car plusieurs valeurs Null sont considérées comme des valeurs dupliquées lors de la création d'un index unique.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.

CLUSTERED Crée un index dans lequel l’ordre logique des valeurs de clés détermine l’ordre physique des lignes correspondantes dans une table.CLUSTERED Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. Le niveau inférieur (ou feuille) de l'index cluster contient les lignes de données réelles de la table.The bottom, or leaf, level of the clustered index contains the actual data rows of the table. Une table ou une vue ne peut avoir qu'un seul index cluster à la fois.A table or view is allowed one clustered index at a time.

Une vue avec un index cluster unique est appelée une vue indexée.A view with a unique clustered index is called an indexed view. La création d'un index cluster unique sur une vue matérialise physiquement la vue.Creating a unique clustered index on a view physically materializes the view. Un index cluster unique doit être créé sur une vue avant la définition de tout autre index sur cette même vue.A unique clustered index must be created on a view before any other indexes can be defined on the same view. Pour plus d’informations, consultez Créer des vues indexées.For more information, see Create Indexed Views.

Créez l'index cluster avant les index non cluster.Create the clustered index before creating any nonclustered indexes. Les index non cluster déjà existants sur les tables sont reconstruits lors de la création d'un index cluster.Existing nonclustered indexes on tables are rebuilt when a clustered index is created.

Si vous ne spécifiez pas CLUSTERED, le système crée un index non cluster.If CLUSTERED is not specified, a nonclustered index is created.

Notes

Le niveau feuille d’un index cluster et les pages de données étant, par définition, identiques, la création d’un index cluster et l’utilisation de la clause ON partition_scheme_name ou ON filegroup_name déplace en fait une table du groupe de fichiers dans lequel la table a été créée vers le nouveau schéma de partition ou le nouveau groupe de fichiers.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. Avant de créer des tables ou des index sur des groupes de fichiers spécifiques, vérifiez quels sont les groupes de fichiers disponibles et s'ils disposent de suffisamment d'espace vide pour l'index.Before creating tables or indexes on specific filegroups, verify which filegroups are available and that they have enough empty space for the index.

Dans certains cas, la création d'un index cluster peut activer les index précédemment désactivés.In some cases creating a clustered index can enable previously disabled indexes. Pour plus d’informations, consultez Activer les index et contraintes et Désactiver les index et contraintes.For more information, see Enable Indexes and Constraints and Disable Indexes and Constraints.

NONCLUSTERED Crée un index qui spécifie l’ordre logique d’une table.NONCLUSTERED Creates an index that specifies the logical ordering of a table. Avec un index non cluster, l'ordre physique des lignes de données est indépendant de l'ordre indexé.With a nonclustered index, the physical order of the data rows is independent of their indexed order.

Chaque table peut comporter jusqu'à 999 index non cluster, indépendamment de la façon dont les index sont créés : implicitement avec des contraintes PRIMARY KEY et UNIQUE ou explicitement avec 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.

Pour les vues indexées, les index non cluster peuvent être créés uniquement dans une vue ayant un index cluster unique déjà défini.For indexed views, nonclustered indexes can be created only on a view that has a unique clustered index already defined.

Sauf indication contraire, le type d’index par défaut est NONCLUSTERED.If not otherwise specified, the default index type is NONCLUSTERED.

index_name Indique le nom de l’index.index_name Is the name of the index. Les noms d'index doivent être uniques dans une table ou une vue, mais ne doivent pas être nécessairement uniques dans une base de données.Index names must be unique within a table or view but do not have to be unique within a database. Les noms d’index doivent se conformer aux règles régissant les identificateurs.Index names must follow the rules of identifiers.

column Indique la ou les colonnes sur lesquelles l’index est basé.column Is the column or columns on which the index is based. Spécifiez deux ou plusieurs noms de colonnes pour créer un index composite sur les valeurs combinées des colonnes spécifiées.Specify two or more column names to create a composite index on the combined values in the specified columns. Répertoriez les colonnes à inclure dans l’index composite, suivant l’ordre de priorité de tri, dans les parenthèses après 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.

Vous pouvez combiner jusqu’à 32 colonnes dans une même clé d’index composite.Up to 32 columns can be combined into a single composite index key. Toutes les colonnes d'une clé d'index composite doivent se trouver dans la même table ou la même vue.All the columns in a composite index key must be in the same table or view. La taille maximale autorisée pour les valeurs d’index combinées est de 900 octets pour un index cluster, ou de 1 700 pour un index non-cluster.The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. Les limites sont de 16 colonnes et de 900 octets pour les versions antérieures à SQL DatabaseSQL Database et à SQL Server 2016 (13.x)SQL Server 2016 (13.x).The limits are 16 columns and 900 bytes for versions before SQL DatabaseSQL Database and SQL Server 2016 (13.x)SQL Server 2016 (13.x).

Les colonnes ayant les types de données LOB (Large OBject) ntext, text, varchar(max), nvarchar(max), varbinary(max), xml ou image ne peuvent pas être spécifiées comme colonnes clés pour un index.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. De plus, une définition de vue ne peut pas contenir des colonnes ntext, text ou image, même si elles ne sont pas référencées dans l’instruction CREATE INDEX.Also, a view definition cannot include ntext, text, or image columns, even if they are not referenced in the CREATE INDEX statement.

Vous pouvez créer des index sur des colonnes de type CLR défini par l'utilisateur si le type prend en charge le tri binaire.You can create indexes on CLR user-defined type columns if the type supports binary ordering. Vous pouvez également créer des index sur des colonnes calculées définies comme appels de méthodes d'une colonne de type défini par l'utilisateur, dès lors que les méthodes sont déterministes et n'exécutent pas des opérations d'accès aux données.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. Pour plus d’informations sur l’indexation des colonnes de types CLR définis par l’utilisateur, consultez Types CLR définis par l’utilisateur.For more information about indexing CLR user-defined type columns, see CLR User-defined Types.

[ ASC | DESC ] Détermine le sens croissant ou décroissant du tri d’une colonne d’index particulière.[ ASC | DESC ] Determines the ascending or descending sort direction for the particular index column. La valeur par défaut est ASC.The default is ASC.

INCLUDE (column [ ,... n ] ) Spécifie les colonnes non clés à ajouter au niveau feuille de l’index non cluster.INCLUDE (column [ ,... n ] ) Specifies the non-key columns to be added to the leaf level of the nonclustered index. L'index non cluster peut être unique ou non.The nonclustered index can be unique or non-unique.

Les noms de colonne ne peuvent pas être répétés dans la liste INCLUDE et ne peuvent pas être utilisés simultanément comme colonnes clés et colonnes non clés.Column names cannot be repeated in the INCLUDE list and cannot be used simultaneously as both key and non-key columns. Les index non cluster contiennent toujours les colonnes de l'index cluster si un index cluster est défini sur la table.Nonclustered indexes always contain the clustered index columns if a clustered index is defined on the table. Pour plus d’informations, consultez Créer des index avec colonnes incluses.For more information, see Create Indexes with Included Columns.

Tous les types de données sont autorisés, à l'exception de text, ntextet image.All data types are allowed except text, ntext, and image. L’index doit être créé ou reconstruit hors connexion (ONLINE = OFF) si l’une des colonnes non-clés spécifiées est du type de données 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.

Les colonnes calculées déterministes et précises ou imprécises peuvent être des colonnes incluses.Computed columns that are deterministic and either precise or imprecise can be included columns. Les colonnes calculées dérivées des types de données image, ntext, text, varchar(max), nvarchar(max), varbinary(max) et xml peuvent être incluses dans des colonnes non-clés dès lors que le type de données de la colonne calculée est autorisé comme colonne incluse.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. Pour plus d'informations, consultez Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Pour plus d’informations sur la création d’un index XML, consultez CREATE XML INDEX.For information on creating an XML index, see CREATE XML INDEX.

WHERE <filter_predicate> Crée un index filtré en spécifiant les lignes à inclure dans l’index.WHERE <filter_predicate> Creates a filtered index by specifying which rows to include in the index. L'index filtré doit être un index non cluster sur une table.The filtered index must be a nonclustered index on a table. Crée des statistiques filtrées pour les lignes de données dans l'index filtré.Creates filtered statistics for the data rows in the filtered index.

Le prédicat de filtre utilise une logique de comparaison simple et ne peut pas référencer une colonne calculée, une colonne UDT, une colonne de type de données spatiales ou une colonne de type de données 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. Les comparaisons à l'aide de littéraux NULL ne sont pas autorisées avec les opérateurs de comparaison.Comparisons using NULL literals are not allowed with the comparison operators. Utilisez les opérateurs IS NULL et IS NOT NULL à la place.Use the IS NULL and IS NOT NULL operators instead.

Voici quelques exemples de prédicats de filtre pour la table 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

Les index filtrés ne s'appliquent pas aux index XML ni aux index de recherche en texte intégral.Filtered indexes do not apply to XML indexes and full-text indexes. Pour les index UNIQUES, seules les lignes sélectionnées doivent avoir des valeurs d'index unique.For UNIQUE indexes, only the selected rows must have unique index values. Les index filtrés ne permettent pas d'utiliser l'option IGNORE_DUP_KEY.Filtered indexes do not allow the IGNORE_DUP_KEY option.

ON partition_scheme_name **( column_name) ** S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.ON partition_scheme_name ( column_name ) Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Spécifie le schéma de partition qui définit les groupes de fichiers auxquels les partitions d'un index partitionné seront mappées.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index will be mapped. Le schéma de partition doit exister dans la base de données en exécutant soit CREATE PARTITION SCHEME, soit ALTER PARTITION SCHEME.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME. column_name spécifie la colonne par rapport à laquelle un index partitionné sera partitionné.column_name specifies the column against which a partitioned index will be partitioned. Cette colonne doit correspondre au type de données, à la longueur et à la précision de l’argument de la fonction de partition que partition_scheme_name utilise.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’est pas limité aux colonnes de la définition d’index.column_name is not restricted to the columns in the index definition. Toute colonne de la table de base peut être spécifiée, sauf lors du partitionnement d’un index UNIQUE ; le nom de colonne column_name doit être choisi parmi les noms de colonnes utilisés comme clés uniques.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. Cette restriction permet au Moteur de base de donnéesDatabase Engine de vérifier l'unicité des valeurs de clés dans une seule partition uniquement.This restriction allows the Moteur de base de donnéesDatabase Engine to verify uniqueness of key values within a single partition only.

Notes

Lorsque vous partitionnez un index cluster non unique, le Moteur de base de donnéesDatabase Engine ajoute par défaut la colonne de partitionnement à la liste des clés d'index cluster, si elle n'est pas déjà spécifiée.When you partition a non-unique, clustered index, the Moteur de base de donnéesDatabase Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. Lorsque vous partitionnez un index non cluster non unique, le Moteur de base de donnéesDatabase Engine ajoute la colonne de partitionnement sous la forme d'une colonne (incluse) non clé de l'index, si elle n'est pas déjà spécifiée.When partitioning a non-unique, nonclustered index, the Moteur de base de donnéesDatabase Engine adds the partitioning column as a non-key (included) column of the index, if it is not already specified.

Si partition_scheme_name ou filegroup n’est pas spécifié et que la table est partitionnée, l’index est placé dans le même schéma de partition que la table sous-jacente, en utilisant la même colonne de partitionnement.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.

Notes

Vous ne pouvez pas spécifier un schéma de partitionnement dans un index XML.You cannot specify a partitioning scheme on an XML index. Si la table de base est partitionnée, l'index XML utilise le même schéma de partition que la table.If the base table is partitioned, the XML index uses the same partition scheme as the table.

Pour plus d’informations sur le partitionnement d’index, consultez Tables et index partitionnés.For more information about partitioning indexes, Partitioned Tables and Indexes.

ON filegroup_name **S’applique à **: SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017.ON filegroup_name Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Crée l'index spécifié dans le groupe de fichiers spécifié.Creates the specified index on the specified filegroup. Si aucun emplacement n'est défini et que la table ou la vue n'est pas partitionnée, l'index utilise le même groupe de fichiers que la table ou la vue sous-jacente.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. Le groupe de fichiers doit déjà exister.The filegroup must already exist.

ON " default " S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.ON " default " Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Crée l’index spécifié dans le même groupe de fichiers ou schéma de partition que la table ou la vue.Creates the specified index on the same filegroup or partition scheme as the table or view.

Le terme « default », dans ce contexte, n'est pas un mot clé.The term default, in this context, is not a keyword. Il s’agit de l’identificateur du groupe de fichiers par défaut et il doit être délimité, comme dans ON " default " ou ON [ default ].It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Si "default" est spécifié, l'option QUOTED_IDENTIFIER doit être activée (ON) pour la session active.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Il s'agit du paramètre par défaut.This is the default setting. Pour plus d’informations, voir SET QUOTED_IDENTIFIER.For more information, see SET QUOTED_IDENTIFIER.

Notes

« default » n’indique pas le groupe de fichiers de base de données par défaut dans le contexte de CREATE INDEX."default" does not indicate the database default filegroup in the context of CREATE INDEX. Cela diffère de CREATE TABLE, où « default » localise la table dans le groupe de fichiers de base de données par défaut.This differs from CREATE TABLE, where "default" locates the table on the database default filegroup.

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ] S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017.[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ] Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Spécifie le positionnement de données FILESTREAM pour la table lorsqu'un index cluster est créé.Specifies the placement of FILESTREAM data for the table when a clustered index is created. La clause FILESTREAM_ON permet le déplacement des données FILESTREAM vers un schéma de partition ou un groupe de fichiers FILESTREAM différent.The FILESTREAM_ON clause allows FILESTREAM data to be moved to a different FILESTREAM filegroup or partition scheme.

filestream_filegroup_name est le nom d’un groupe de fichiers FILESTREAM.filestream_filegroup_name is the name of a FILESTREAM filegroup. Le groupe de fichiers doit avoir un fichier défini pour le groupe de fichiers à l’aide d’une instruction CREATE DATABASE ou ALTER DATABASE ; dans le cas contraire, une erreur est générée.The filegroup must have one file defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement; otherwise, an error is raised.

Si la table est partitionnée, la clause FILESTREAM_ON doit être incluse et doit spécifier un schéma de partition de groupes de fichiers FILESTREAM qui utilise les mêmes fonctions de partition et colonnes de partition que le schéma de partition pour la table.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. Dans le cas contraire, une erreur est générée.Otherwise, an error is raised.

Si la table n'est pas partitionnée, la colonne FILESTREAM ne peut pas être partitionnée.If the table is not partitioned, the FILESTREAM column cannot be partitioned. Les données FILESTREAM pour la table doivent être stockées dans un groupe de fichiers unique spécifié dans la clause 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 peut être spécifié dans une instruction CREATE INDEX si un index cluster est créé et si la table ne contient pas de colonne 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.

Pour plus d’informations, consultez FILESTREAM (SQL Server).For more information, see FILESTREAM (SQL Server).

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

Objet qualifié complet ou partiel à indexer.Is the fully qualified or nonfully qualified object to be indexed.

database_name Nom de la base de données.database_name Is the name of the database.

schema_name Nom du schéma auquel la table ou la vue appartient.schema_name Is the name of the schema to which the table or view belongs.

table_or_view_name Nom de la table ou de la vue à indexer.table_or_view_name Is the name of the table or view to be indexed.

La vue doit être définie avec SCHEMABINDING pour pouvoir créer un index sur celle-ci.The view must be defined with SCHEMABINDING to create an index on it. Un index cluster unique doit être créé sur une vue avant la création de tout index non cluster.A unique clustered index must be created on a view before any nonclustered index is created. Pour plus d'informations sur les vues indexées, consultez la section Remarques.For more information about indexed views, see the Remarks section.

Depuis SQL Server 2016 (13.x)SQL Server 2016 (13.x), l’objet peut être une table stockée avec un index columnstore cluster.Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x), the object can be a table stored with a clustered columnstore index.

Azure SQL DatabaseAzure SQL Database prend en charge le format de nom en trois parties database_name.[schema_name].object_name quand database_name est la base de données active ou quand database_name est tempdb et que object_name commence par #.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>::=

Spécifie les options à utiliser lorsque vous créez l'index.Specifies the options to use when you create the index.

PAD_INDEX = {ON | OFF } S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.PAD_INDEX = { ON | OFF } Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Spécifie le remplissage de l'index.Specifies index padding. La valeur par défaut est OFF.The default is OFF.

ON Le pourcentage d’espace libre spécifié par fillfactor est appliqué aux pages de niveau intermédiaire de l’index.ON The percentage of free space that is specified by fillfactor is applied to the intermediate-level pages of the index.

OFF ou fillfactor non spécifié Les pages de niveau intermédiaire de l’index sont presque entièrement remplies, ce qui laisse un espace libre suffisant pour prendre en charge au moins une ligne de la taille maximale permise par l’index, en prenant en compte l’ensemble de clés sur les pages intermédiaires.OFF or fillfactor is not specified The intermediate-level pages are filled to near capacity, leaving sufficient space for at least one row of the maximum size the index can have, considering the set of keys on the intermediate pages.

L'option PAD_INDEX est utile seulement si FILLFACTOR est spécifié, car PAD_INDEX utilise le pourcentage spécifié par FILLFACTOR.The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. Si le pourcentage défini pour FILLFACTOR n'est pas suffisamment élevé pour autoriser une ligne, le Moteur de base de donnéesDatabase Engine remplace en interne le pourcentage de façon à ce qu'il autorise le minimum.If the percentage specified for FILLFACTOR is not large enough to allow for one row, the Moteur de base de donnéesDatabase Engine internally overrides the percentage to allow for the minimum. Le nombre de lignes dans une page d’index intermédiaire n’est jamais inférieur à deux, quelle que soit la faiblesse de la valeur de fillfactor.The number of rows on an intermediate index page is never less than two, regardless of how low the value of fillfactor.

Dans la syntaxe de compatibilité descendante, WITH PAD_INDEX est équivalent à WITH PAD_INDEX = ON.In backward compatible syntax, WITH PAD_INDEX is equivalent to WITH PAD_INDEX = ON.

FILLFACTOR =fillfactor S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.FILLFACTOR =fillfactor Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Spécifie un pourcentage indiquant le taux de remplissage appliqué par le Moteur de base de donnéesDatabase Engine au niveau feuille de chaque page d'index lors de la création ou de la reconstruction de l'index.Specifies a percentage that indicates how full the Moteur de base de donnéesDatabase Engine should make the leaf level of each index page during index creation or rebuild. fillfactor doit être une valeur entière comprise entre 1 et 100.fillfactor must be an integer value from 1 to 100. Si fillfactor a la valeur 100, le Moteur de base de donnéesDatabase Engine crée des index avec des pages de niveau feuille intégralement remplies.If fillfactor is 100, the Moteur de base de donnéesDatabase Engine creates indexes with leaf pages filled to capacity.

La valeur FILLFACTOR s'applique uniquement lors de la création ou de la reconstruction de l'index.The FILLFACTOR setting applies only when the index is created or rebuilt. Le Moteur de base de donnéesDatabase Engine ne conserve pas dynamiquement dans les pages le pourcentage d'espace libre défini.The Moteur de base de donnéesDatabase Engine does not dynamically keep the specified percentage of empty space in the pages. Pour afficher le facteur de remplissage, utilisez la vue de catalogue sys.indexes.To view the fill factor setting, use the sys.indexes catalog view.

Important

La création d'un index cluster avec un facteur de remplissage FILLFACTOR inférieur à 100 affecte la quantité d'espace de stockage qu'occupent les données, car le Moteur de base de donnéesDatabase Engine redistribue les données lorsqu'il crée l'index cluster.Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the Moteur de base de donnéesDatabase Engine redistributes the data when it creates the clustered index.

Pour plus d’informations, consultez Spécifier un facteur de remplissage pour un index.For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = {ON | OFF } S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.SORT_IN_TEMPDB = { ON | OFF } Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Spécifie s’il faut stocker les résultats temporaires du tri dans tempdb.Specifies whether to store temporary sort results in tempdb. La valeur par défaut est OFF.The default is OFF.

ON Les résultats intermédiaires du tri utilisés pour créer l’index sont stockés dans tempdb.ON The intermediate sort results that are used to build the index are stored in tempdb. Cela peut réduire le temps nécessaire pour créer un index si tempdb ne se trouve pas sur le même groupe de disques que la base de données utilisateur.This may reduce the time required to create an index if tempdb is on a different set of disks than the user database. Toutefois, une plus grande quantité d'espace disque est alors utilisée lors de la création de l'index.However, this increases the amount of disk space that is used during the index build.

Les résultats de tri intermédiaires sont stockés dans la même base de données que l’index.OFF The intermediate sort results are stored in the same database as the index.

En plus de l’espace nécessaire dans la base de données utilisateur pour créer l’index, tempdb doit disposer à peu près d’autant d’espace supplémentaire pour stocker les résultats intermédiaires du tri.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. Pour plus d’informations, consultez Option SORT_IN_TEMPDB pour les index.For more information, see SORT_IN_TEMPDB Option For Indexes.

Dans la syntaxe de compatibilité descendante, WITH SORT_IN_TEMPDB est équivalent à 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 } Spécifie la réponse d’erreur lorsqu’une opération d’insertion essaie d’insérer des valeurs de clés en double dans un index unique.IGNORE_DUP_KEY = { ON | OFF } Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. L'option IGNORE_DUP_KEY s'applique uniquement aux opérations d'insertion après la création ou la régénération de l'index.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. Cette option n’a aucun effet lors de l’exécution de CREATE INDEX, d’ALTER INDEX ou d’UPDATE.The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. La valeur par défaut est OFF.The default is OFF.

ON : un message d’avertissement s’affiche lorsque des valeurs de clé en double sont insérées dans un index unique.ON A warning message will occur when duplicate key values are inserted into a unique index. Seules les lignes qui violent la contrainte d'unicité échouent.Only the rows violating the uniqueness constraint will fail.

OFF : un message d’erreur s’affiche lorsque des valeurs de clé en double sont insérées dans un index unique.OFF An error message will occur when duplicate key values are inserted into a unique index. L'intégralité de l'opération INSERT sera restaurée.The entire INSERT operation will be rolled back.

IGNORE_DUP_KEY ne peut pas être activé (ON) dans le cas d'index créés sur une vue, d'index non uniques, d'index XML, d'index spatiaux et d'index filtrés.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

Pour afficher IGNORE_DUP_KEY, utilisez sys.indexes.To view IGNORE_DUP_KEY, use sys.indexes.

Dans la syntaxe de compatibilité descendante, WITH IGNORE_DUP_KEY est équivalent à 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} Spécifie si les statistiques de distribution sont recalculées.STATISTICS_NORECOMPUTE = { ON | OFF} Specifies whether distribution statistics are recomputed. La valeur par défaut est OFF.The default is OFF.

ON Les statistiques obsolètes ne sont pas recalculées automatiquement.ON Out-of-date statistics are not automatically recomputed.

OFF La mise à jour automatique des statistiques est activée.OFF Automatic statistics updating are enabled.

Pour restaurer la mise à jour automatique des statistiques, affectez la valeur OFF à STATISTICS_NORECOMPUTE ou exécutez UPDATE STATISTICS sans la clause NORECOMPUTE.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

Important

La désactivation du recalcul automatique des statistiques de distribution peut empêcher l'optimiseur de requête de sélectionner des plans d'exécution optimaux pour les requêtes qui impliquent la table.Disabling automatic recomputation of distribution statistics may prevent the query optimizer from picking optimal execution plans for queries involving the table.

Dans la syntaxe de compatibilité descendante, WITH STATISTICS_NORECOMPUTE est équivalent à WITH STATISTICS_NORECOMPUTE = ON.In backward compatible syntax, WITH STATISTICS_NORECOMPUTE is equivalent to WITH STATISTICS_NORECOMPUTE = ON.

STATISTICS_INCREMENTAL = { ON | OFF } Quand cette option est définie sur ON, les statistiques sont créées pour chaque partition.STATISTICS_INCREMENTAL = { ON | OFF } When ON, the statistics created are per partition statistics. Si la valeur est OFF, l’arborescence des statistiques est supprimée et SQL ServerSQL Server recalcule les statistiques.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. La valeur par défaut est OFF.The default is OFF.

Si les statistiques par partition ne sont pas prises en charge, l'option est ignorée et un avertissement est généré.If per partition statistics are not supported the option is ignored and a warning is generated. Les statistiques incrémentielles ne sont pas prises en charge pour les types de statistiques suivants :Incremental stats are not supported for following statistics types:

  • statistiques créées avec des index qui ne sont pas alignés sur les partitions avec la table de base ;Statistics created with indexes that are not partition-aligned with the base table.
  • statistiques créées sur les bases de données secondaires lisibles Always On ;Statistics created on Always On readable secondary databases.
  • statistiques créées sur les bases de données en lecture seule ;Statistics created on read-only databases.
  • statistiques créées sur les index filtrés ;Statistics created on filtered indexes.
  • statistiques créées sur les vues ;Statistics created on views.
  • statistiques créées sur les tables internes ;Statistics created on internal tables.
  • Statistiques créées avec les index spatiaux ou les index XML.Statistics created with spatial indexes or XML indexes.

DROP_EXISTING = { ON | OFF } Option permettant de supprimer et de reconstruire l’index cluster ou non cluster avec des spécifications de colonne modifiées, tout en conservant le même nom pour l’index.DROP_EXISTING = { ON | OFF } 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. La valeur par défaut est OFF.The default is OFF.

ON Spécifie de supprimer et de reconstruire l’index qui doit avoir le même nom que le paramètre index_name.ON Specifies to drop and rebuild the existing index, which must have the same name as the parameter index_name.

OFF Spécifie de ne pas supprimer et de ne pas recréer l’index.OFF Specifies not to drop and rebuild the existing index. SQL Server affiche une erreur si le nom d’index spécifié existe déjà.SQL Server displays an error if the specified index name already exists.

DROP_EXISTING vous permet de transformer :With DROP_EXISTING, you can change:

  • Un index rowstore non-cluster en index rowstore cluster.A nonclustered rowstore index to a clustered rowstore index.

DROP_EXISTING ne vous permet pas de modifier :With DROP_EXISTING, you cannot change:

  • Un index rowstore cluster en index rowstore non-cluster.A clustered rowstore index to a nonclustered rowstore index.
  • Un index columnstore cluster en n’importe quel type d’index rowstore.A clustered columnstore index to any type of rowstore index.

Dans la syntaxe de compatibilité descendante, WITH DROP_EXISTING est équivalent à WITH DROP_EXISTING = ON.In backward compatible syntax, WITH DROP_EXISTING is equivalent to WITH DROP_EXISTING = ON.

ONLINE = { ON | OFF } Indique si les tables sous-jacentes et les index associés sont disponibles pour les requêtes et la modification de données pendant l’opération d’indexation.ONLINE = { ON | OFF } Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. La valeur par défaut est OFF.The default is OFF.

Notes

Les opérations d'index en ligne ne sont pas disponibles dans toutes les éditions de MicrosoftMicrosoftSQL ServerSQL Server.Online index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Pour obtenir la liste des fonctionnalités prises en charge par les éditions de SQL ServerSQL Server, consultez Fonctionnalités prises en charge par les éditions de 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.

ON Les verrous de table à long terme ne sont pas maintenus pendant la durée de l’opération d’indexation.ON Long-term table locks are not held for the duration of the index operation. Lors de la principale phase de l'indexation, seul le verrou de partage intentionnel (IS, Intent Share) est maintenu sur la table source.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. Ceci permet d'exécuter les requêtes ou les mises à jour dans la table sous-jacente et ses index.This enables queries or updates to the underlying table and indexes to proceed. Au début de l'opération, un verrou partagé (S, Shared) est placé sur l'objet source pendant une période de temps très courte.At the start of the operation, a Shared (S) lock is held on the source object for a very short period of time. À la fin de l'opération, pendant une période de temps très courte, un verrou partagé (S, Shared) est placé sur la source si un index non cluster est créé, ou bien un verrou de SCH-M (Modification du schéma) est placé lorsqu'un index cluster est créé ou supprimé en ligne et lorsqu'un index cluster ou non cluster est régénéré.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. ONLINE ne peut pas prendre la valeur ON si un index est en cours de création sur une table locale temporaire.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFF Des verrous de table sont appliqués pendant l’opération d’indexation.OFF Table locks are applied for the duration of the index operation. Une opération d'indexation hors ligne qui crée, régénère ou supprime un index cluster, ou régénère ou supprime un index non cluster, acquiert un verrou de modification de schéma (Sch-M) sur la table.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. Cela empêche tous les utilisateurs d'accéder à la table sous-jacente pendant la durée de l'opération.This prevents all user access to the underlying table for the duration of the operation. Une opération d'indexation hors ligne qui crée un index non cluster acquiert un verrou partagé (S, Shared) sur la table.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. Cela empêche la mise à jour de la table sous-jacente, mais autorise les opérations de lecture, telles que des instructions SELECT.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

Pour plus d’informations, consultez Fonctionnement des opérations d’index en ligne.For more information, see How Online Index Operations Work.

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

S’applique à : SQL DatabaseSQL Database et SQL Server 2019 - PreviewSQL Server 2019 preview (préversion publique)Applies to: SQL DatabaseSQL Database and SQL Server 2019 - PreviewSQL Server 2019 preview (public preview)

Spécifie si une opération d’index en ligne peut être reprise.Specifies whether an online index operation is resumable.

ON L’opération de l’index peut être reprise.ON Index operation is resumable.

OFF L’opération de l’index ne peut pas être reprise.OFF Index operation is not resumable.

MAX_DURATION = time [MINUTES] utilisé avec RESUMABLE = ON (nécessite ONLINE = ON).MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON).

S’applique à : SQL DatabaseSQL Database et SQL Server 2019 - PreviewSQL Server 2019 preview (fonctionnalité d’évaluation publique)Applies to: SQL DatabaseSQL Database and SQL Server 2019 - PreviewSQL Server 2019 preview as a public preview feature

Indique le temps (valeur entière spécifiée en minutes) pendant lequel une opération d’index en ligne pouvant être reprise est exécutée avant d’être mise en pause.Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

Avertissement

Pour plus d’informations sur les opérations d’index pouvant être effectuées en ligne, consultez Instructions pour les opérations d’index en ligne.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

Les index, y compris les index des tables temporaires globales, peuvent être créés en ligne, à l'exception des index suivants :Indexes, including indexes on global temp tables, can be created online with the following exceptions:

  • Index XMLXML index
  • index de table temporaire locale ;Index on a local temp table.
  • index cluster unique initial sur une vue ;Initial unique clustered index on a view.
  • index cluster désactivés ;Disabled clustered indexes.
  • index cluster si la table sous-jacente contient des types de données LOB : image, ntext, text et des types spatiaux.Clustered index if the underlying table contains LOB data types: image, ntext, text, and spatial types.
  • Les colonnes varchar(max) et varbinary(max) ne peuvent pas faire partie d’un index.varchar(max) and varbinary(max) columns cannot be part of an index. Dans SQL ServerSQL Server (en commençant par SQL Server 2012 (11.x)SQL Server 2012 (11.x)) et dans SQL DatabaseSQL Database, quand une table contient des colonnes varchar(max) ou varbinary(max), un index cluster contenant d’autres colonnes peut être créé ou reconstruit à l’aide de l’option ONLINE.In SQL ServerSQL Server (beginning with SQL Server 2012 (11.x)SQL Server 2012 (11.x)) and in SQL DatabaseSQL 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. SQL DatabaseSQL Database n’autorise pas l’option ONLINE quand la table de base contient des colonnes varchar(max) ou varbinary(max).does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns.

Pour plus d'informations, consultez Perform Index Operations Online.For more information, see Perform Index Operations Online.

ALLOW_ROW_LOCKS = { ON | OFF } S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.ALLOW_ROW_LOCKS = { ON | OFF } Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Indique si les verrous de ligne sont autorisés ou non.Specifies whether row locks are allowed. La valeur par défaut est ON.The default is ON.

ON Les verrous de ligne sont autorisés lors de l’accès à l’index.ON Row locks are allowed when accessing the index. Le Moteur de base de donnéesDatabase Engine détermine le moment où les verrous de ligne sont utilisés.The Moteur de base de donnéesDatabase Engine determines when row locks are used.

OFF Les verrous de ligne ne sont pas utilisés.OFF Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF } S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.ALLOW_PAGE_LOCKS = { ON | OFF } Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Indique si les verrous de page sont autorisés.Specifies whether page locks are allowed. La valeur par défaut est ON.The default is ON.

ON Les verrous de page sont autorisés lors de l’accès à l’index.ON Page locks are allowed when accessing the index. Le Moteur de base de donnéesDatabase Engine détermine le moment où les verrous de page sont utilisés.The Moteur de base de donnéesDatabase Engine determines when page locks are used.

OFF Les verrous de page ne sont pas utilisés.OFF Page locks are not used.

MAXDOP = max_degree_of_parallelism S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.MAXDOP = max_degree_of_parallelism Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Remplace l’option de configuration max degree of parallelism pendant la durée de l’opération d’index.Overrides the max degree of parallelism configuration option for the duration of the index operation. Pour plus d’informations, consultez Configurer l’option de configuration du serveur max degree of parallelism.For more information, see Configure the max degree of parallelism Server Configuration Option. Utilisez MAXDOP pour limiter le nombre de processeurs utilisés dans une exécution de plan parallèle.Use MAXDOP to limit the number of processors used in a parallel plan execution. Le nombre maximal de processeurs est égal à 64.The maximum is 64 processors.

max_degree_of_parallelism peut avoir la valeur :max_degree_of_parallelism can be:

1 Supprime la génération de plans parallèles.1 Suppresses parallel plan generation.

>1 Limite le nombre maximal de processeurs utilisés dans l’indexation parallèle au nombre défini ou à un nombre inférieur en fonction de la charge de travail actuelle du système.>1 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 (par défaut) Utilise le nombre réel de processeurs ou un nombre inférieur en fonction de la charge de travail actuelle du système.0 (default) Uses the actual number of processors or fewer based on the current system workload.

Pour plus d’informations, consultez Configurer des opérations d’index parallèles.For more information, see Configure Parallel Index Operations.

Notes

Les opérations d’index parallèles ne sont pas disponibles dans toutes les éditions de MicrosoftMicrosoftSQL ServerSQL Server.Parallel index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Pour obtenir la liste des fonctionnalités prises en charge par les éditions de SQL ServerSQL Server, consultez Éditions et fonctionnalités prises en charge de SQL Server 2016 et Éditions et fonctionnalités prises en charge pour 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_COMPRESSION Spécifie l’option de compression de données pour l’index, le numéro de partition ou la plage de partitions spécifiés.DATA_COMPRESSION Specifies the data compression option for the specified index, partition number, or range of partitions. Les options disponibles sont les suivantes :The options are as follows:

NONE L’index ou les partitions spécifiées ne sont pas compressés.NONE Index or specified partitions are not compressed.

ROW L’index ou les partitions spécifiées sont compressés au moyen de la compression de ligne.ROW Index or specified partitions are compressed by using row compression.

PAGE L’index ou les partitions spécifiées sont compressés au moyen de la compression de page.PAGE Index or specified partitions are compressed by using page compression.

Pour plus d’informations sur la compression, consultez Compression des données.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] ) S’applique à : SQL Server 2008SQL Server 2008 via SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] ) Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

Spécifie les partitions auxquelles le paramètre DATA_COMPRESSION s'applique.Specifies the partitions to which the DATA_COMPRESSION setting applies. Si l'index n'est pas partitionné, l'argument ON PARTITIONS générera une erreur.If the index is not partitioned, the ON PARTITIONS argument will generate an error. Si la clause ON PARTITIONS n'est pas fournie, l'option DATA_COMPRESSION s'applique à toutes les partitions d'un index partitionné.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression> peut être spécifié des manières suivantes :<partition_number_expression> can be specified in the following ways:

  • Spécifiez le numéro de partition, par exemple : ON PARTITIONS (2).Provide the number for a partition, for example: ON PARTITIONS (2).
  • Spécifiez des numéros de partition pour plusieurs partitions individuelles séparées par des virgules, par exemple : ON PARTITIONS (1, 5).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • Spécifiez à la fois des plages et des partitions individuelles, par exemple : ON PARTITIONS (2, 4, 6 TO 8).Provide both ranges and individual partitions, for example: ON PARTITIONS (2, 4, 6 TO 8).

<range> peut être spécifié sous la forme de numéros de partitions séparés par le mot TO, par exemple : ON PARTITIONS (6 TO 8).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

Pour définir des types différents de compression de données pour des partitions différentes, spécifiez plusieurs fois l'option DATA_COMPRESSION, par exemple :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)
);

Notes Remarks

L'instruction CREATE INDEX est optimisée comme toute autre requête.The CREATE INDEX statement is optimized like any other query. Pour consommer moins de ressources sur les opérations d'E/S, le processeur de requêtes peut choisir d'analyser un autre index au lieu d'effectuer une analyse de la table.To save on I/O operations, the query processor may choose to scan another index instead of performing a table scan. L'opération de tri peut être éliminée dans certains cas.The sort operation may be eliminated in some situations. Sur des ordinateurs multiprocesseurs, CREATE INDEX peut utiliser plusieurs processeurs pour exécuter les opérations d'analyse et de tri associées à la création de l'index, à l'instar des autres requêtes.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. Pour plus d’informations, consultez Configurer des opérations d’index parallèles.For more information, see Configure Parallel Index Operations.

L'opération de création d'index peut être consignée de manière minimale si le mode de récupération de base de données correspond au mode de journalisation en bloc ou au mode simple.The create index operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

Vous pouvez créer des index sur une table temporaire.Indexes can be created on a temporary table. Lorsque la table est supprimée ou que la session prend fin, les index sont supprimés.When the table is dropped or the session ends, the indexes are dropped.

Les index prennent en charge les propriétés étendues.Indexes support extended properties.

Index clusterClustered Indexes

La création d'un index cluster sur une table (segment de mémoire) ou la suppression et la recréation d'un index nécessite un espace de travail supplémentaire dans la base de données pour pouvoir y placer le tri des données et une copie temporaire de la table d'origine ou les données d'index cluster existantes.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. Pour plus d’informations sur les index cluster, consultez Créer des index cluster.For more information about clustered indexes, see Create Clustered Indexes.

Index non-clusterNonclustered Indexes

Depuis SQL Server 2016 (13.x)SQL Server 2016 (13.x) et dans Azure SQL DatabaseAzure SQL Database, vous pouvez créer un index non-cluster sur une table stockée sous la forme d’un index columnstore cluster.Beginning with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in Azure SQL DatabaseAzure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. Si vous créez tout d’abord un index non-cluster sur une table stockée sous la forme d’un segment de mémoire ou d’un index cluster, l’index est conservé si, par la suite, vous convertissez la table en un index columnstore cluster.If you first create a nonclustered index on a table stored as a heap or clustered index, the index will persist if you later convert the table to a clustered columnstore index. Il n’est pas non plus nécessaire de supprimer l’index non-cluster quand vous reconstruisez l’index columnstore cluster.It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

Limitations et restrictions :Limitations and Restrictions:

  • L’option FILESTREAM_ON n’est pas valide quand vous créez un index non-cluster sur une table stockée sous la forme d’un index columnstore cluster.The FILESTREAM_ON option is not valid when you create a nonclustered index on a table stored as a clustered columnstore index.

Index uniquesUnique Indexes

Lorsqu'un index unique existe, le Moteur de base de donnéesDatabase Engine recherche les valeurs dupliquées chaque fois que des données sont ajoutées par des opérations d'insertion.When a unique index exists, the Moteur de base de donnéesDatabase Engine checks for duplicate values each time data is added by a insert operations. Les opérations d'insertion qui génèrent des valeurs de clés dupliquées sont restaurées, et le Moteur de base de donnéesDatabase Engine affiche un message d'erreur.Insert operations that would generate duplicate key values are rolled back, and the Moteur de base de donnéesDatabase Engine displays an error message. Ceci s'applique même si l'insertion modifie un grand nombre de lignes et ne génère qu'une seule valeur dupliquée.This is true even if the insert operation changes many rows but causes only one duplicate. Si vous tentez d'entrer des données pour lesquelles il existe un index unique et que la clause IGNORE_DUP_KEY a la valeur ON, seules les lignes qui violent l'index UNIQUE échouent.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.

Index partitionnésPartitioned Indexes

Les index partitionnés sont créés et gérés pratiquement comme des tables partitionnées, mais comme les index ordinaires, ils sont gérés sous forme d'objets de base de données distincts.Partitioned indexes are created and maintained in a similar manner to partitioned tables, but like ordinary indexes, they are handled as separate database objects. Un index partitionné peut être créé sur une table non partitionnée, et une table partitionnée peut avoir un index non partitionné.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.

Si vous créez un index sur une table partitionnée et que ne spécifiez pas un groupe de fichiers pour y placer l'index, l'index est partitionné de la même manière que la table sous-jacente.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. Ceci s'explique par le fait que les index sont placés par défaut dans les mêmes groupes de fichiers que leurs tables sous-jacentes et, pour une table partitionnée, dans le même schéma de partition qui utilise les mêmes colonnes de partitionnement.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. Quand l’index utilise le même schéma de partition et la même colonne de partitionnement que la table, il est aligné sur la table.When the index uses the same partition scheme and partitioning column as the table, the index is aligned with the table.

Avertissement

La création et la reconstruction des index non alignés sur une table contenant plus de 1 000 partitions sont possibles, mais ne sont pas prises en charge.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Ces opérations peuvent entraîner une dégradation des performances ou une consommation de mémoire excessive.Doing so may cause degraded performance or excessive memory consumption during these operations. Nous vous recommandons d'utiliser uniquement des index alignés lorsque le nombre de partitions est supérieur à 1000.We recommend using only aligned indexes when the number of partitions exceed 1,000.

Lorsque vous partitionnez un index cluster non unique, le Moteur de base de donnéesDatabase Engine ajoute par défaut des colonnes de partitionnement à la liste des clés d'index cluster, si elles ne sont pas déjà spécifiées.When partitioning a non-unique, clustered index, the Moteur de base de donnéesDatabase Engine by default adds any partitioning columns to the list of clustered index keys, if not already specified.

Vous pouvez créer des vues indexées sur des tables partitionnées, en appliquant la même procédure que celle utilisée pour les index sur des tables.Indexed views can be created on partitioned tables in the same manner as indexes on tables. Pour plus d'informations sur les index partitionnés, consultez Partitioned Tables and Indexes.For more information about partitioned indexes, see Partitioned Tables and Indexes.

Dans SQL Server 2017SQL Server 2017, les statistiques ne sont pas créées en analysant toutes les lignes de la table quand un index partitionné est créé ou reconstruit.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. Au lieu de cela, l'optimiseur de requête utilise l'algorithme d'échantillonnage par défaut pour générer des statistiques.Instead, the query optimizer uses the default sampling algorithm to generate statistics. Pour obtenir des statistiques sur les index partitionnés en analysant toutes les lignes de la table, utilisez CREATE STATISTICS ou UPDATE STATISTICS avec la clause 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.

Index filtrésFiltered Indexes

Un index filtré est un index non cluster optimisé, approprié pour les requêtes qui sélectionnent un faible pourcentage de lignes d'une table.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. Il utilise un prédicat de filtre pour indexer une partie des données de la table.It uses a filter predicate to index a portion of the data in the table. Un index filtré bien conçu peut améliorer les performances des requêtes, réduire les coûts de stockage et réduire les coûts de maintenance.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

Options SET requises pour les index filtrésRequired SET Options for Filtered Indexes

Les options SET figurant dans la colonne Valeur requise sont requises chaque fois qu'une des conditions suivantes est vérifiée :The SET options in the Required Value column are required whenever any of the following conditions occur:

  • Vous créez un index filtré.Create a filtered index.

  • L'opération INSERT, UPDATE, DELETE ou MERGE modifie les données dans un index filtré.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.

  • L’index filtré est utilisé par l’optimiseur de requête pour générer le plan de requête.The filtered index is used by the query optimizer to produce the query plan.

    Options définiesSET options Valeur requiseRequired value Valeur de serveur par défautDefault server value Valeur par défautDefault

    Valeur OLE DB et ODBCOLE DB and ODBC value
    Valeur par défautDefault

    Valeur 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

    *L'affectation de la valeur ON à ANSI_WARNINGS affecte de manière implicite la valeur ON à ARITHABORT, lorsque le niveau de compatibilité de la base de données est d'au moins 90.*Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Si le niveau de compatibilité de la base de données est au maximum de 80, la valeur ON doit être affectée de manière explicite à l'option ARITHABORT.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

Si les options SET sont incorrectes, les conditions suivantes peuvent se vérifier :If the SET options are incorrect, the following conditions can occur:

  • L'index filtré n'est pas créé.The filtered index is not created.
  • Le Moteur de base de donnéesDatabase Engine génère une erreur et restaure les instructions INSERT, UPDATE DELETE ou MERGE qui modifient les données incluses dans l'index.The Moteur de base de donnéesDatabase Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.
  • L'optimiseur de requête ne prend en compte l'index dans le plan d'exécution pour aucune instruction Transact-SQL.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

Pour plus d’informations sur les index filtrés, consultez Créer des index filtrés.For more information about Filtered Indexes, see Create Filtered Indexes.

Index spatiauxSpatial Indexes

Pour plus d’informations sur les index spatiaux, consultez CREATE SPATIAL INDEX et Vue d’ensemble des index spatiaux.For information about spatial indexes, see CREATE SPATIAL INDEX and Spatial Indexes Overview.

Index XMLXML Indexes

Pour plus d’informations sur les index XML, consultez CREATE XML INDEX et Index XML (SQL Server).For information about XML indexes see, CREATE XML INDEX and XML Indexes (SQL Server).

Taille de clé d'indexIndex Key Size

La taille maximale d’une clé d’index est de 900 octets pour un index cluster et de 1 700 octets pour un index non-cluster.The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. (Avant SQL DatabaseSQL Database et SQL Server 2016 (13.x)SQL Server 2016 (13.x), la limite était toujours de 900 octets.) Vous pouvez créer des index qui dépassent la limite en octets sur des colonnes varchar si les données existantes des colonnes ne dépassent pas cette limite lors de la création de l’index. Cependant, les actions d’insertion ou de mise à jour suivantes sur les colonnes aboutissant à une taille totale supérieure à la limite échouent.(Before SQL DatabaseSQL Database 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. La clé d’un index cluster ne peut pas contenir de colonnes varchar qui possèdent des données dans l’unité d’allocation 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. Si un index cluster est créé sur une colonne varchar et que les données existantes se trouvent dans l’unité d’allocation IN_ROW_DATA, les actions d’insertion ou de mise à jour réalisées ultérieurement sur la colonne et susceptibles d’envoyer les données hors ligne sont vouées à l’échec.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.

Les index non cluster peuvent contenir des colonnes non-clés au niveau feuille de l'index.Nonclustered indexes can include non-key columns in the leaf level of the index. Le Moteur de base de donnéesDatabase Engine ne tient pas compte de ces colonnes lors du calcul de la taille de la clé d’index.These columns are not considered by the Moteur de base de donnéesDatabase Engine when calculating the index key size . Pour plus d’informations, consultez Créer des index avec colonnes incluses.For more information, see Create Indexes with Included Columns.

Notes

Lorsque des tables sont partitionnées, si les colonnes de clé de partitionnement ne sont pas déjà présentes dans un index cluster non unique, elles sont ajoutées à l'index par le Moteur de base de donnéesDatabase 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 Moteur de base de donnéesDatabase Engine. La taille combinée des colonnes indexées (sans compter les colonnes incluses), plus toutes les colonnes de partitionnement ajoutées, ne peut pas dépasser 1800 octets dans un index cluster non unique.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.

Colonnes calculéesComputed Columns

Des index peuvent être créés sur des colonnes calculées.Indexes can be created on computed columns. En outre, les colonnes calculées peuvent avoir la propriété PERSISTED.In addition, computed columns can have the property PERSISTED. Cela signifie que le Moteur de base de donnéesDatabase Engine stocke les valeurs calculées dans la table et qu'il les met à jour lorsque les autres colonnes dont dépendent les colonnes calculées sont mises à jour.This means that the Moteur de base de donnéesDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. Le Moteur de base de donnéesDatabase Engine utilise ces valeurs persistantes pour créer un index sur la colonne et lorsqu'une requête fait référence à l'index.The Moteur de base de donnéesDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query.

Pour qu'il soit possible de créer un index d'une colonne calculée, celle-ci doit être déterministe et précise.To index a computed column, the computed column must deterministic and precise. Cependant, l'utilisation de la propriété PERSISTED permet d'étendre le type des colonnes calculées indexables pour inclure :However, using the PERSISTED property expands the type of indexable computed columns to include:

  • les colonnes calculées basées sur les fonctions Transact-SQLTransact-SQL et CLR, et les méthodes de type CLR définies par l'utilisateur que l'utilisateur marque comme étant déterministes ;Computed columns based on Transact-SQLTransact-SQL and CLR functions and CLR user-defined type methods that are marked deterministic by the user.
  • les colonnes calculées basées sur des expressions déterministes, comme défini par le Moteur de base de donnéesDatabase Engine, mais qui ne sont pas précises.Computed columns based on expressions that are deterministic as defined by the Moteur de base de donnéesDatabase Engine but imprecise.

Les colonnes calculées persistantes nécessitent de définir les options SET ci-dessous, comme indiqué dans la section précédente Options SET requises pour les index filtrés.Persisted computed columns require the following SET options to be set as shown in the previous section Required SET Options for Filtered Indexes.

La contrainte UNIQUE ou PRIMARY KEY peut contenir une colonne calculée dès lors qu'elle satisfait à toutes les conditions d'indexation.The UNIQUE or PRIMARY KEY constraint can contain a computed column as long as it satisfies all conditions for indexing. En particulier, la colonne calculée doit être déterministe et précise, ou déterministe et permanente.Specifically, the computed column must be deterministic and precise or deterministic and persisted. Pour plus d’informations sur le déterminisme, consultez Fonctions déterministes et non déterministes.For more information about determinism, see Deterministic and Nondeterministic Functions.

Les colonnes calculées dérivées des types de données image, ntext, text, varchar(max), nvarchar(max), varbinary(max) et xml peuvent être indexées comme colonnes clés ou comme colonnes non-clés incluses dès lors que le type de données de la colonne calculée est autorisé comme colonne clé d’index ou comme colonne non-clé incluse.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. Par exemple, vous ne pouvez pas créer un index XML primaire sur une colonne xml calculée.For example, you cannot create a primary XML index on a computed xml column. Si la taille de la clé d'index est supérieure à 900 octets, un message d'avertissement est affiché.If the index key size exceeds 900 bytes, a warning message is displayed.

La création d'un index sur une colonne calculée peut provoquer l'échec d'une opération d'insertion ou de mise à jour qui fonctionnait auparavant.Creating an index on a computed column may cause the failure of an insert or update operation that previously worked. Ce type d'échec peut survenir lorsque la colonne calculée génère une erreur arithmétique.Such a failure may take place when the computed column results in arithmetic error. Par exemple, dans la table suivante, bien que la colonne calculée c retourne une erreur arithmétique, l’instruction INSERT fonctionne.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);

Par contre, si après avoir créé la table, vous créez un index sur la colonne calculée c, la même instruction INSERT va échouer.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);

Pour plus d'informations, consultez Indexes on Computed Columns.For more information, see Indexes on Computed Columns.

Colonnes incluses dans les indexIncluded Columns in Indexes

Des colonnes non clés, appelées colonnes incluses, peuvent être ajoutées au niveau feuille d'un index non cluster pour améliorer les performances d'une requête en couvrant la requête.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. En l'occurrence, toutes les colonnes référencées dans la requête sont incluses dans l'index sous forme de colonnes clés ou de colonnes non clés.That is, all columns referenced in the query are included in the index as either key or non-key columns. Ainsi, l'optimiseur de requête peut rechercher toutes les informations nécessaires via une analyse de l'index ; il n'accède pas à la table, ni aux données de l'index cluster.This allows the query optimizer to locate all the required information from an index scan; the table or clustered index data is not accessed. Pour plus d’informations, consultez Créer des index avec colonnes incluses.For more information, see Create Indexes with Included Columns.

Définition des options d'indexSpecifying Index Options

SQL Server 2005 (9.x)SQL Server 2005 (9.x) a introduit de nouvelles options d'index et modifié également la façon dont les options sont spécifiées.introduced new index options and also modifies the way in which options are specified. Dans la syntaxe à compatibilité descendante, WITH option_name est équivalent à WITH (<option_name> = ON ).In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ). Lorsque vous définissez les options d'index, les règles suivantes s'appliquent :When you set index options, the following rules apply:

  • Les nouvelles options d’index peuvent être spécifiées uniquement en utilisant WITH (option_name = ON | OFF).New index options can only be specified by using WITH (option_name = ON | OFF).
  • Vous ne pouvez pas définir les options en utilisant la syntaxe de compatibilité descendante et la nouvelle syntaxe dans une même instruction.Options cannot be specified by using both the backward compatible and new syntax in the same statement. Par exemple, si vous définissez WITH (DROP_EXISTING, ONLINE = ON), l’instruction échoue.For example, specifying WITH (DROP_EXISTING, ONLINE = ON) causes the statement to fail.
  • Quand vous créez un index XML, les options doivent être spécifiées en utilisant WITH (option_name= ON | OFF).When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF).

Clause DROP_EXISTINGDROP_EXISTING Clause

Vous pouvez utiliser la clause DROP_EXISTING pour régénérer l'index, ajouter ou supprimer des colonnes, modifier des options, modifier l'ordre de tri des colonnes ou modifier le schéma de partition ou le groupe de fichiers.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.

Si l'index applique une contrainte PRIMARY KEY ou UNIQUE et que sa définition n'est pas modifiée, l'index est supprimé et recréé en conservant la contrainte existante.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. Toutefois, si la définition de l'index est modifiée, l'instruction échoue.However, if the index definition is altered the statement fails. Pour changer la définition d'une contrainte PRIMARY KEY ou UNIQUE, supprimez la contrainte et ajoutez une contrainte avec la nouvelle définition.To change the definition of a PRIMARY KEY or UNIQUE constraint, drop the constraint and add a constraint with the new definition.

DROP_EXISTING améliore les performances lorsque vous recréez un index cluster, avec le même groupe de clés ou un groupe de clés différent, sur une table qui contient également des index non cluster.DROP_EXISTING enhances performance when you re-create a clustered index, with either the same or different set of keys, on a table that also has nonclustered indexes. DROP_EXISTING remplace l'exécution d'une instruction DROP INDEX dans l'ancien index cluster, suivie de l'exécution d'une instruction CREATE INDEX pour le nouvel index cluster.DROP_EXISTING replaces the execution of a DROP INDEX statement on the old clustered index followed by the execution of a CREATE INDEX statement for the new clustered index. Les index non cluster sont régénérés une fois, et ensuite seulement si la définition d'index est modifiée.The nonclustered indexes are rebuilt once, and then only if the index definition has changed. La clause DROP_EXISTING ne régénère pas les index non cluster lorsque la définition d'index porte le même nom d'index, a les mêmes colonnes clé et de partition, le même attribut d'unicité et le même ordre de tri que l'index d'origine.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.

Que les index non cluster soient régénérés ou non, ils restent toujours dans leur groupes de fichiers ou schémas de partition d'origine et utilisent les fonctions de partition d'origine.Whether the nonclustered indexes are rebuilt or not, they always remain in their original filegroups or partition schemes and use the original partition functions. Si un index cluster est régénéré dans un groupe de fichiers ou un schéma de partition différent, les index non cluster ne sont pas déplacés pour coïncider avec le nouvel emplacement de l'index cluster.If a clustered index is rebuilt to a different filegroup or partition scheme, the nonclustered indexes are not moved to coincide with the new location of the clustered index. Par conséquent, même si les index non cluster ont été alignés sur l'index cluster, ils peuvent ne plus être alignés avec celui-ci.Therefore, even the nonclustered indexes previously aligned with the clustered index, they may no longer be aligned with it. Pour plus d’informations sur les index partitionnés, consultez Index et tables partitionnés.For more information about partitioned index alignment, see Partitioned Tables and Indexes.

La clause DROP_EXISTING ne retrie pas les données si les mêmes colonnes de clé d'index sont utilisées dans le même ordre et avec le même ordre croissant ou descendant, sauf si l'instruction d'indexation spécifie un index non cluster et que l'option ONLINE est désactivée (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. Si l'index cluster est désactivé, l'opération CREATE INDEX WITH DROP_EXISTING doit être exécutée avec l'option ONLINE désactivée (OFF).If the clustered index is disabled, the CREATE INDEX WITH DROP_EXISTING operation must be performed with ONLINE set to OFF. Si un index non cluster est désactivé et n'est pas associé à un index cluster désactivé, l'opération CREATE INDEX WITH DROP_EXISTING peut être exécutée avec l'option ONLINE désactivée (OFF) ou activée (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.

Lorsque des index avec 128 extensions ou plus sont supprimés ou régénérés, le Moteur de base de donnéesDatabase Engine diffère les désallocations de page réelles et leurs verrous associés jusqu'à la validation de la transaction.When indexes with 128 extents or more are dropped or rebuilt, the Moteur de base de donnéesDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

Option ONLINEONLINE Option

Les instructions suivantes s'appliquent aux opérations d'indexation en ligne :The following guidelines apply for performing index operations online:

  • La table sous-jacente ne peut pas être modifiée, tronquée ou supprimée tant qu'une opération d'indexation en ligne est en cours.The underlying table cannot be altered, truncated, or dropped while an online index operation is in process.
  • Un espace disque temporaire supplémentaire est nécessaire au cours de l'opération d'indexation.Additional temporary disk space is required during the index operation.
  • Des opérations en ligne peuvent être exécutées sur les index partitionnés et sur les index qui contiennent des colonnes calculées persistantes ou des colonnes incluses.Online operations can be performed on partitioned indexes and indexes that contain persisted computed columns, or included columns.

Pour plus d'informations, consultez Perform Index Operations Online.For more information, see Perform Index Operations Online.

Opérations d’index pouvant être reprisesResumable index operations

S’applique à : SQL DatabaseSQL Database et SQL Server 2019 - PreviewSQL Server 2019 preview (préversion publique)Applies to: SQL DatabaseSQL Database and SQL Server 2019 - PreviewSQL Server 2019 preview (public preview)

Les instructions suivantes s’appliquent aux opérations d’index pouvant être reprises :The following guidelines apply for resumable index operations:

  • La création d’index en ligne est spécifiée comme pouvant être reprise avec l’option RESUMABLE = ON.Online index create is specified as resumable using the RESUMABLE = ON option.
  • L’option RESUMABLE n’est pas persistante dans les métadonnées d’un index donné et s’applique uniquement à la durée d’une instruction DDL actuelle.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. C’est pourquoi la clause RESUMABLE=ON doit être spécifiée explicitement pour permettre la reprise.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.
  • L’option MAX_DURATION n’est prise en charge que pour l’option RESUMABLE = ON.MAX_DURATION option is only supported for RESUMABLE = ON option.
  • MAX_DURATION pour l’option RESUMABLE spécifie l’intervalle de temps d’un index en cours de génération.MAX_DURATION for RESUMABLE option specifies the time interval for an index being built. Une fois ce délai écoulé, la génération d’index est mise en pause ou termine son exécution.Once this time is used the index build is either paused or it completes its execution. L’utilisateur choisit quand reprendre la génération d’un index en pause.User decides when a build for a paused index can be resumed. La durée en minutes de MAX_DURATION doit être supérieure à 0 minute et inférieur ou égale à une semaine (7 * 24 * 60 = 10080 minutes).The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). Si la mise en pause d’une opération d’index est longue, les performances DML d’une table spécifique et la capacité de disque de la base de données risquent d’être impactées parce que les deux index, l’original et celui nouvellement créé, ont besoin d’espace disque et doivent être mis à jour au cours des opérations 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. Si l’option MAX_DURATION est omise, l’opération d’index se poursuit jusqu'à ce qu’elle se termine ou qu’une défaillance se produise.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
  • Pour mettre tout de suite en pause l’opération d’index, vous pouvez arrêter (Ctrl-C) la commande en cours ou bien exécuter la commande ALTER INDEX PAUSE ou la commande 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. Une commande en pause peut être reprise avec la commande ALTER INDEX.Once the command is paused, it can be resumed using ALTER INDEX command.
  • Si l’instruction CREATE INDEX d’origine est réexécutée sur un index pouvant être repris, l’opération de création d’index en pause est automatiquement reprise.Re-executing the original CREATE INDEX statement for resumable index, automatically resumes a paused index create operation.
  • L’option SORT_IN_TEMPDB=ON n’est pas prise en charge sur les index pouvant être repris.The SORT_IN_TEMPDB=ON option is not supported for resumable index.
  • Vous ne pouvez pas exécuter la commande DDL avec RESUMABLE=ON dans une transaction explicite (ne peut pas faire partie d’un block begin TRAN ... COMMIT).The DDL command with RESUMABLE=ON cannot be executed inside an explicit transaction (cannot be part of begin TRAN ... COMMIT block).
  • Pour reprendre/abandonner une création/regénération d’index, utilisez la syntaxe T-SQL ALTER INDEX.To resume/abort an index create/rebuild, use the ALTER INDEX T-SQL syntax

Notes

La commande DDL s’exécute tant qu’elle n’a pas fini, n’est pas mise en pause ou n’a pas échoué.The DDL command runs until it completes, pauses or fails. Si la commande est en pause, une erreur s’affiche indiquant que l’opération a été mise en pause et que la création d’index n’a pas été effectuée.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. Vous trouverez plus d’informations sur l’état d’index actuel dans sys.index_resumable_operations.More information about the current index status can be obtained from sys.index_resumable_operations. Comme avant, en cas de défaillance, une erreur s’affiche également.As before in case of a failure an error will be issued as well.

Pour indiquer qu’une création d’index est exécutée sous la forme d’une opération pouvant être reprise et pour connaître son état d’exécution actuel, voir 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.

RessourcesResources

Les ressources suivantes sont requises pour l’opération de création d’index en ligne pouvant être reprise :The following resources are required for resumable online index create operation:

  • De l’espace supplémentaire nécessaire pour conserver l’index en cours de construction, y compris le temps lorsque l’index est en pauseAdditional space required to keep the index being built, including the time when index is being paused
  • Du débit de journal supplémentaire pendant la phase de tri.Additional log throughput during the sorting phase. L’utilisation globale d’espace journal d’un index pouvant être repris est inférieure à celle de la création d’un index en ligne classique ; la troncature du journal est permise pendant cette opération.The overall log space usage for resumable index is less compared to regular online index create and allows log truncation during this operation.
  • Un état DDL empêchant toute modification DDLA DDL state preventing any DDL modification
  • Le nettoyage des éléments fantômes est bloqué sur l’index en génération pendant toute la durée de l’opération, qu’elle soit en pause ou en cours d’exécution.Ghost cleanup is blocked on the in-build index for the duration of the operation both while paused and while the operation is running.

Limitations fonctionnelles actuellesCurrent functional limitations

Les fonctionnalités suivantes sont désactivées pour les opérations de création d’index pouvant être reprises :The following functionality is disabled for resumable index create operations:

  • Une fois l’opération de création d’index en ligne pouvant être reprise mise en pause, la valeur initiale de MAXDOP n’est plus modifiable.After a resumable online index create operation is paused, the initial value of MAXDOP cannot be changed

  • Créez un index contenant :Create an index that contains:

    • la ou les colonnes calculées ou TIMESTAMP en tant que colonnes clés ;Computed or TIMESTAMP column(s) as key columns
    • la colonne LOB en tant que colonne incluse pour la création d’index pouvant être reprise.LOB column as included column for resumable index create
    • Index filtréFiltered index

Options de verrous de ligne et de pageRow and Page Locks Options

Lorsque ALLOW_ROW_LOCKS = ON et ALLOW_PAGE_LOCK = ON, les verrous de ligne, de page et de table sont autorisés lors de l'accès à l'index.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-, page-, and table-level locks are allowed when accessing the index. Le Moteur de base de donnéesDatabase Engine choisit le verrou approprié et peut promouvoir un verrou de ligne ou de page en verrou de table.The Moteur de base de donnéesDatabase Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

Lorsque ALLOW_ROW_LOCKS = OFF et ALLOW_PAGE_LOCK = OFF, seul un verrou de table est autorisé lors de l'accès à l'index.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when accessing the index.

Affichage des informations sur les indexViewing Index Information

Pour retourner des informations sur les index, vous pouvez utiliser des affichages catalogue, des fonctions système et des procédures stockées système.To return information about indexes, you can use catalog views, system functions, and system stored procedures.

Data CompressionData Compression

La compression de données est décrite dans la rubrique Compression de données.Data compression is described in the topic Data Compression. Voici les points clés à prendre en compte :The following are key points to consider:

  • La compression permet de stocker un plus grand nombre de lignes dans une page, mais ne modifie pas la taille maximale des lignes.Compression can allow more rows to be stored on a page, but does not change the maximum row size.
  • Les pages non-feuille d'un index ne sont pas compressées par le biais de la compression de page, mais par le biais de la compression de ligne.Non-leaf pages of an index are not page compressed but can be row compressed.
  • Chaque index non cluster dispose d'un paramètre de compression individuel et n'hérite pas du paramètre de compression de la table sous-jacente.Each nonclustered index has an individual compression setting, and does not inherit the compression setting of the underlying table.
  • Lorsqu'un index cluster est créé sur un segment de mémoire, l'index cluster hérite de l'état de compression du segment, à moins qu'un autre état de compression soit spécifié.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.

Les restrictions suivantes s'appliquent aux index partitionnés :The following restrictions apply to partitioned indexes:

  • Vous ne pouvez pas modifier le paramètre de compression d'une partition unique si la table possède des index non alignés.You cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • La syntaxe ALTER INDEX <index> ... REBUILD PARTITION ... reconstruit la partition spécifiée de l’index.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • La syntaxe ALTER INDEX <index> ... REBUILD WITH ... reconstruit toutes les partitions de l’index.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

Pour évaluer la façon dont la modification de l’état de compression affecte une table, un index ou une partition, utilisez la procédure stockée 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.

AutorisationsPermissions

Nécessite une autorisation ALTER sur la table ou la vue.Requires ALTER permission on the table or view. L’utilisateur doit être membre du rôle serveur fixe sysadmin ou des rôles de base de données fixes db_ddladmin et db_owner .User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Limitations et restrictionsLimitations and Restrictions

Dans SQL Data WarehouseSQL Data Warehouse et Parallel Data WarehouseParallel Data Warehouse, vous ne pouvez pas créer :SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse, you cannot create:

  • Un index rowstore cluster ou non-cluster sur une table d’entrepôt de données quand il existe déjà un index columnstore.A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. Ce comportement est différent de SQL ServerSQL Server SMP qui permet à des index rowstore et columnstore de coexister sur la même table.This behavior is different from SMP SQL ServerSQL Server which allows both rowstore and columnstore indexes to co-exist on the same table.
  • Vous ne pouvez pas créer un index sur une vue.You cannot create an index on a view.

MétadonnéesMetadata

Pour afficher des informations sur les index existants, vous pouvez interroger la vue de catalogue sys.indexes.To view information on existing indexes, you can query the sys.indexes catalog view.

Notes de versionVersion Notes

SQL DatabaseSQL Database ne prend pas en charge les options filegroup et filestream.does not support filegroup and filestream options.

Exemples : Toutes les versions.Examples: All versions. Utilise la base de données AdventureWorksUses the AdventureWorks database

A.A. Créer un index rowstore non-cluster simpleCreate a simple nonclustered rowstore index

Les exemples suivants créent un index non-cluster sur la colonne VendorID de la table 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. Créer un index composite rowstore non-cluster simpleCreate a simple nonclustered rowstore composite index

L’exemple suivant crée un index composite non-cluster sur les colonnes SalesQuota et SalesYTD de la table 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. Créer un index sur une table dans une autre base de donnéesCreate an index on a table in another database

L’exemple suivant crée un index non-cluster sur la colonne VendorID de la table ProductVendor dans la base de données 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. Ajouter une colonne à un indexAdd a column to an index

L’exemple suivant crée un index IX_FF avec deux colonnes à partir de la table dbo.FactFinance.The following example creates index IX_FF with two columns from the dbo.FactFinance table. L’instruction suivante reconstruit l’index avec une colonne supplémentaire et conserve le nom existant.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 );

Exemples : SQL Server, Azure SQL DatabaseExamples: SQL Server, Azure SQL Database

E.E. Créer un index non-cluster uniqueCreate a unique nonclustered index

L'exemple suivant crée un index non cluster unique sur la colonne Name de la table Production.UnitMeasure dans la base de données AdventureWorks2012AdventureWorks2012.The following example creates a unique nonclustered index on the Name column of the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. L'index applique la contrainte d'unicité sur les données insérées dans la colonne Name.The index will enforce uniqueness on the data inserted into the Name column.

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

La requête suivante teste la contrainte d'unicité en tentant d'insérer une ligne avec une valeur existant dans une autre ligne.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());

Le message d'erreur retourné est :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. Utiliser l’option IGNORE_DUP_KEYUse the IGNORE_DUP_KEY option

L'exemple suivant montre l'effet de l'option IGNORE_DUP_KEY en insérant plusieurs lignes dans une table temporaire avec cette option d'abord définie sur ON, puis sur 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. Une ligne est insérée dans la table #Test pour créer intentionnellement une valeur dupliquée lorsque la deuxième instruction INSERT, qui va insérer plusieurs lignes, est exécutée.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. Un compteur de lignes de la table retourne le nombre de lignes insérées.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

Voici les résultats de la deuxième instruction 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

Notez que les lignes insérées depuis la table Production.UnitMeasure qui ne violent pas la contrainte d'unicité ont été correctement insérées.Notice that the rows inserted from the Production.UnitMeasure table that did not violate the uniqueness constraint were successfully inserted. Un avertissement est émis, et la ligne dupliquée est ignorée ; l'ensemble de la transaction n'a pas été restauré.A warning was issued and the duplicate row ignored, but the entire transaction was not rolled back.

Les mêmes instructions sont exécutées de nouveau, mais avec IGNORE_DUP_KEY défini sur 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

Voici les résultats de la deuxième instruction 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

Notez qu'aucune des lignes de la table Production.UnitMeasure n'a été insérée dans la table, alors qu'une seule ligne de la table a violé la contrainte UNIQUE de l'index.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. Utilisation de DROP_EXISTING pour supprimer et recréer un indexUsing DROP_EXISTING to drop and re-create an index

L'exemple suivant supprime et recrée un index existant sur la colonne ProductID de la table Production.WorkOrder dans la base de données AdventureWorks2012AdventureWorks2012 avec l'option 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. Les options FILLFACTOR et PAD_INDEX sont également définies.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. Créer un index sur une vueCreate an index on a view

L'exemple suivant crée une vue et un index sur cette vue.The following example creates a view and an index on that view. Deux requêtes sont incluses, lesquelles utilisent la vue indexée.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. Créer un index avec des colonnes (non-clés) inclusesCreate an index with included (non-key) columns

L'exemple suivant crée un index non cluster avec une colonne clé (PostalCode) et quatre colonnes non clés (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). Une requête couverte par l'index suit.A query that is covered by the index follows. Pour afficher l’index sélectionné par l’optimiseur de requête, dans le menu Requête de SQL Server Management StudioSQL Server Management Studio, sélectionnez Inclure le plan d’exécution réel avant d’exécuter la requête.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. Créer un index partitionnéCreate a partitioned index

L'exemple suivant crée un index partitionné non cluster sur TransactionsPS1, un schéma de partition existant dans la base de données AdventureWorks2012AdventureWorks2012.The following example creates a nonclustered partitioned index on TransactionsPS1, an existing partition scheme in the AdventureWorks2012AdventureWorks2012 database. Cet exemple suppose que l'exemple d'index partitionné a été installé.This example assumes the partitioned index sample has been installed.

S’applique à : SQL Server 2008SQL Server 2008 à SQL Server 2017SQL Server 2017 et Azure SQL DatabaseAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL DatabaseAzure SQL Database.

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

K.K. Création d'un index filtréCreating a filtered index

L'exemple suivant crée un index filtré sur la table Production.BillOfMaterials dans la base de données AdventureWorks2012AdventureWorks2012.The following example creates a filtered index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. Le prédicat de filtre peut inclure des colonnes qui ne sont pas des colonnes clés dans l'index filtré.The filter predicate can include columns that are not key columns in the filtered index. Dans cet exemple, le prédicat sélectionne uniquement les lignes où EndDate n'est pas 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. Créer un index compresséCreate a compressed index

L'exemple ci-dessous illustre la création d'un index sur une table non partitionnée à l'aide de la compression de ligne.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

L'exemple ci-dessous illustre la création d'un index sur une table partitionnée à l'aide de la compression de ligne sur toutes les partitions de l'index.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

L'exemple ci-dessous illustre la création d'un index sur une table partitionnée à l'aide de la compression de page sur la partition 1 de l'index et à l'aide de la compression de ligne sur les partitions 2 à 4 de l'index.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. Créer, reprendre, suspendre et abandonner des opérations d’index pouvant être reprisesCreate, resume, pause, and abort resumable index operations

S’applique à : SQL DatabaseSQL Database et SQL Server 2019 - PreviewSQL Server 2019 preview (préversion publique)Applies to: SQL DatabaseSQL Database and SQL Server 2019 - PreviewSQL Server 2019 preview (public preview)

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

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

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

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

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

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

Exemples : Azure SQL Data WarehouseAzure SQL Data Warehouse et Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

N.N. Syntaxe de baseBasic syntax

Créer, reprendre, suspendre et abandonner des opérations d’index pouvant être reprisesCreate, resume, pause, and abort resumable index operations

S’applique à : SQL DatabaseSQL Database et SQL Server 2019 - PreviewSQL Server 2019 preview (préversion publique)Applies to: SQL DatabaseSQL Database and SQL Server 2019 - PreviewSQL Server 2019 preview (public preview)

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

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

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

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

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

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

O.O. Créer un index non-cluster sur une table de la base de données activeCreate a non-clustered index on a table in the current database

L’exemple suivant crée un index non-cluster sur la colonne VendorID de la table 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. Créer un index cluster sur une table dans une autre base de donnéesCreate a clustered index on a table in another database

L’exemple suivant crée un index non-cluster sur la colonne VendorID de la table ProductVendor dans la base de données 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);

 Voir aussiSee Also