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

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Преобразование таблицы rowstore в кластеризованный индекс columnstore или создание некластеризованного индекса columnstore.Convert a rowstore table to a clustered columnstore index or create a nonclustered columnstore index. Используйте индекс columnstore для эффективного выполнения операционной аналитики в реальном времени в рабочей нагрузке OLTP или повышения производительности сжатия данных и запросов для рабочих нагрузок хранилищ данных.Use a columnstore index to efficiently run real-time operational analytics on an OLTP workload or to improve data compression and query performance for data warehousing workloads.

Примечание

Начиная с версии SQL Server 2016 (13.x);SQL Server 2016 (13.x) таблицы можно создавать как кластеризованный индекс columnstore.Starting with SQL Server 2016 (13.x);SQL Server 2016 (13.x), you can create the table as a clustered columnstore index. Больше не нужно сначала создавать таблицу rowstore, а затем преобразовывать ее в кластеризованный индекс columnstore.It is no longer necessary to first create a rowstore table and then convert it to a clustered columnstore index.

Совет

Дополнительные сведения о правилах проектирования индексов см. в статье Руководство по проектированию индексов SQL Server.For information on index design guidelines, refer to the SQL Server Index Design Guide.

Примеры:Skip to examples:

Сценарии:Go to scenarios:

Дополнительные сведения:Learn more:

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
-- Create a clustered columnstore index on disk-based table.  
CREATE CLUSTERED COLUMNSTORE INDEX index_name  
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }  
    [ WITH ( < with_option> [ ,...n ] ) ]  
    [ ON <on_option> ] 
[ ; ]  
  
--Create a nonclustered columnstore index on a disk-based table.  
CREATE [NONCLUSTERED]  COLUMNSTORE INDEX index_name   
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
        ( column  [ ,...n ] )  
    [ WHERE <filter_expression> [ AND <filter_expression> ] ]
    [ WITH ( < with_option> [ ,...n ] ) ]  
    [ ON <on_option> ]
[ ; ]  
  
<with_option> ::=  
      DROP_EXISTING = { ON | OFF } -- default is OFF  
    | MAXDOP = max_degree_of_parallelism 
    | ONLINE = { ON | OFF } 
    | COMPRESSION_DELAY  = { 0 | delay [ Minutes ] }  
    | DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
      [ ON PARTITIONS ( { partition_number_expression | range } [ ,...n ] ) ]  
  
<on_option>::=  
      partition_scheme_name ( column_name )
    | filegroup_name
    | "default"
  
<filter_expression> ::=  
      column_name IN ( constant [ ,...n ]  
    | column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant  
  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name } 
    [ORDER (column [,...n] ) ]  
    [ WITH ( DROP_EXISTING = { ON | OFF } ) ] --default is OFF  
[;]  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

АргументыArguments

Некоторые параметры доступны не во всех версиях ядра СУБД.Some of the options are not available in all database engine versions. В следующей таблице показаны версии, в которых параметры добавлены в индексы CLUSTERED COLUMNSTORE и NONCLUSTERED COLUMNSTORE:The following table shows the versions when the options are introduced in CLUSTERED COLUMNSTORE and NONCLUSTERED COLUMNSTORE indexes:

ПараметрOption CLUSTEREDCLUSTERED NONCLUSTEREDNONCLUSTERED
COMPRESSION_DELAYCOMPRESSION_DELAY SQL Server 2016 (13.x);SQL Server 2016 (13.x) SQL Server 2016 (13.x);SQL Server 2016 (13.x)
DATA_COMPRESSIONDATA_COMPRESSION SQL Server 2016 (13.x);SQL Server 2016 (13.x) SQL Server 2016 (13.x);SQL Server 2016 (13.x)
ONLINEONLINE SQL Server 2019 (15.x)SQL Server 2019 (15.x) SQL Server 2017 (14.x);SQL Server 2017 (14.x)
WHERE, предложениеWHERE clause НедоступноN/A SQL Server 2016 (13.x);SQL Server 2016 (13.x)

Все параметры доступны в Базе данных SQL Azure.All options are available in Azure SQL Database.

СОЗДАНИЕ КЛАСТЕРИЗОВАННОГО ИНДЕКСА COLUMNSTORECREATE CLUSTERED COLUMNSTORE INDEX

Создание кластеризованного индекса columnstore, в котором все данные сжаты и сохранены по столбцам.Create a clustered columnstore index in which all of the data is compressed and stored by column. Индекс включает все столбцы в таблице и сохраняет всю таблицу.The index includes all of the columns in the table, and stores the entire table. Если существующая таблица является кучей или кластеризованным индексом, она преобразуется в кластеризованный индекс columnstore.If the existing table is a heap or clustered index, the table is converted to a clustered columnstore index. Если таблица уже хранится в виде кластеризованного индекса columnstore, то существующий индекс будет удален и перестроен.If the table is already stored as a clustered columnstore index, the existing index is dropped and rebuilt.

index_nameindex_name
Задает имя нового индекса.Specifies the name for the new index.

Если таблица уже является кластеризованным индексом columnstore, вы можете указать то же имя, что у существующего индекса, или задать новое имя с помощью параметра DROP EXISTING.If the table already has a clustered columnstore index, you can specify the same name as the existing index, or you can use the DROP EXISTING option to specify a new name.

ON [database_name.ON [database_name. [schema_name ] .[schema_name ] . | schema_name . | schema_name . ] table_name] table_name

Задает одно-, двух- или трехкомпонентное имя таблицы, которая должна быть сохранена как кластеризованный индекс columnstore.Specifies the one-, two-, or three-part name of the table to be stored as a clustered columnstore index. Если таблица является кучей или кластеризованным индексом, она преобразуется из rowstore в columnstore.If the table is a heap or clustered index the table is converted from rowstore to a columnstore. Если таблица уже columnstore, эта инструкция перестраивает кластеризованный индекс columnstore.If the table is already a columnstore, this statement rebuilds the clustered columnstore index. Для преобразования в упорядоченный кластеризованный индекс columnstore существующий индекс должен быть кластеризованным индексом columnstore.To convert to an ordered clustered column store index the existing index must be a clustered columnstore index.

Параметры WITHWITH options

DROP_EXISTING = [OFF] | ONDROP_EXISTING = [OFF] | ON

DROP_EXISTING = ON удаляет существующий индекс и создает индекс columnstore.DROP_EXISTING = ON specifies to drop the existing index, and create a new columnstore index.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH (DROP_EXISTING = ON);

По умолчанию DROP_EXISTING = OFF ожидает, что имя индекса совпадает с существующим именем.The default, DROP_EXISTING = OFF expects the index name is the same as the existing name. Если индекс с указанным именем уже существует, выдается ошибка.An error occurs is the specified index name already exists.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

Переопределяет существующую конфигурацию максимальной степени параллелизма сервера на время выполнения этой операции с индексом.Overrides the existing maximum degree of parallelism server configuration for the duration of the index operation. MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов.Use MAXDOP to limit the number of processors used in a parallel plan execution. Максимальное число процессоров — 64.The maximum is 64 processors.

Значения max_degree_of_parallelism могут быть следующими:max_degree_of_parallelism values can be:

  • 1 — подавляет создание параллельных планов.1 - Suppress parallel plan generation.
  • >1 — ограничивает максимальное число процессоров, используемых в параллельных операциях с индексами, заданным или меньшим числом в зависимости от текущей рабочей нагрузки системы.>1 - Restrict the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload. Например, если MAXDOP = 4, то число используемых процессоров будет равно 4 или меньше.For example, when MAXDOP = 4, the number of processors used is 4 or less.
  • 0 (по умолчанию) — в зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.0 (default) - Use the actual number of processors or fewer based on the current system workload.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH (MAXDOP = 2);

Дополнительные сведения см. в статьях Настройка параметра конфигурации сервера max degree of parallelism и Настройка параллельных операций с индексами.For more information, see Configure the max degree of parallelism Server Configuration Option, and Configure Parallel Index Operations.

COMPRESSION_DELAY = 0 | delay [ мин ]COMPRESSION_DELAY = 0 | delay [ Minutes ]

Для таблицы на основе диска значение delay указывает минимальное количество минут, в течение которых разностная группа строк в состоянии CLOSED должна оставаться в разностной группе строк до того, как SQL Server сожмет ее в сжатую группу строк.For a disk-based table, delay specifies the minimum number of minutes a delta rowgroup in the CLOSED state must remain in the delta rowgroup before SQL Server can compress it into the compressed rowgroup. Поскольку таблицы на основе диска не отслеживают время вставки и обновления отдельных строк, SQL Server применяет задержку к разностным группам строк в состоянии CLOSED.Since disk-based tables don't track insert and update times on individual rows, SQL Server applies the delay to delta rowgroups in the CLOSED state.
Значение по умолчанию — 0 минут.The default is 0 minutes.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH ( COMPRESSION_DELAY = 10 Minutes );

Рекомендации по использованию COMPRESSION_DELAY см. в разделе Начало работы с columnstore для получения операционной аналитики в реальном времени.For recommendations on when to use COMPRESSION_DELAY, see Get started with Columnstore for real time operational analytics.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVEDATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Задает режим сжатия данных для указанной таблицы, номера секции или диапазона секций.Specifies the data compression option for the specified table, partition number, or range of partitions. Существуют следующие варианты выбора.The options are as follows:

  • COLUMNSTORE является значением по умолчанию и задает сжатие с использованием самого эффективного сжатия columnstore.COLUMNSTORE is the default and specifies to compress with the most performant columnstore compression. Это обычный вариант.This is the typical choice.
  • Параметр COLUMNSTORE_ARCHIVE обеспечивает дальнейшее сжатие таблицы или секции до еще меньшего размера.COLUMNSTORE_ARCHIVE further compresses the table or partition to a smaller size. Этот параметр можно использовать в ситуациях, где требуется уменьшение размера хранилища и допускается увеличение затрат времени на сохранение и выборку.Use this option for situations such as archival that require a smaller storage size and can afford more time for storage and retrieval.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

Дополнительные сведения о сжатии см. в разделе Сжатие данных.For more information about compression, see Data Compression.

ONLINE = [ON | OFF]ONLINE = [ON | OFF]
  • Значение ON указывает, что индекс columnstore остается в сети и доступен во время создания новой копии индекса.ON specifies that the columnstore index remains online and available while the new copy of the index is being built.
  • Значение OFF указывает, что индекс недоступен для использования во время создания новой копии.OFF specifies that the index is not available for use while the new copy is being built.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
       WITH ( ONLINE = ON );

Параметры ONON options

Параметры ON позволяют задавать параметры для хранения данных, такие как схема секционирования, конкретная файловая группа или файловая группа по умолчанию.With the ON options you can specify options for data storage, such as a partition scheme, a specific filegroup, or the default filegroup. Если параметр ON не задан, индекс использует параметры секционирования или параметры файловой группы существующей таблицы.If the ON option is not specified, the index uses the settings partition or filegroup settings of the existing table.

имя_схемы_секционирования ( имя_столбца )partition_scheme_name ( column_name )
Задает схему секционирования для таблицы.Specifies the partition scheme for the table. Эта схема секционирования должна уже существовать в базе данных.The partition scheme must already exist in the database. Описание создания схемы секционирования см. в разделе CREATE PARTITION SCHEME.To create the partition scheme, see CREATE PARTITION SCHEME.

column_name указывает столбец, по которому будет секционирован индекс.column_name specifies the column against which a partitioned index is partitioned. Столбец должен соответствовать по типу данных, длине и точности аргументу функции секционирования, используемой аргументом partition_scheme_name.This column must match the data type, length, and precision of the argument of the partition function that partition_scheme_name is using.

filegroup_namefilegroup_name
Указывает файловую группу для хранения кластеризованного индекса columnstore.Specifies the filegroup for storing the clustered columnstore index. Если местоположение не указано и таблица не секционирована, индекс использует ту же файловую группу, что и базовая таблица или представление.If no location is specified and the table is not partitioned, the index uses the same filegroup as the underlying table or view. Файловая группа должна существовать.The filegroup must already exist.

" default "" default "
Чтобы создать индекс для файловой группы по умолчанию, используйте значение default или [ default ].To create the index on the default filegroup, use "default" or [ default ].

Если указано значение "default" (по умолчанию), параметр QUOTED_IDENTIFIER должен иметь значение ON для текущего сеанса.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. QUOTED_IDENTIFIER по умолчанию равен ON.QUOTED_IDENTIFIER is ON by default. Дополнительные сведения см. в статье SET QUOTED_IDENTIFIER (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

CREATE [NONCLUSTERED] COLUMNSTORE INDEXCREATE [NONCLUSTERED] COLUMNSTORE INDEX

Создайте выполняемый в памяти некластеризованный индекс columnstore в таблице rowstore, хранимой в виде кучи или кластеризованного индекса.Create an in-memory nonclustered columnstore index on a rowstore table stored as a heap or clustered index. Индекс может иметь условие фильтрации и не должен включать все столбцы базовой таблицы.The index can have a filtered condition and does not need to include all of the columns of the underlying table. Индекс columnstore требует достаточно места для хранения копии данных.The columnstore index requires enough space to store a copy of the data. Он может обновляться и обновляется по мере изменения базовой таблицы.It is updateable and is updated as the underlying table is changed. Некластеризованный индекс columnstore в кластеризованном индексе допускает аналитику в реальном времени.The nonclustered columnstore index on a clustered index enables real-time analytics.

index_nameindex_name
Указывает имя индекса.Specifies the name of the index. Значение index_name должно быть уникальным в пределах таблицы, но необязательно должно быть уникальным в пределах базы данных.index_name must be unique within the table, but does not have to be unique within the database. Имена индексов должны удовлетворять правилам для идентификаторов.Index names must follow the rules of identifiers.

( столбец [ , ...n ] )( column [ ,...n ] )
Задает столбцы для хранения.Specifies the columns to store. Некластеризованный индекс columnstore может включать не более 1024 столбцов.A nonclustered columnstore index is limited to 1024 columns.
Каждый столбец должен иметь поддерживаемый тип данных для индексов columnstore.Each column must be of a supported data type for columnstore indexes. В разделе Ограничения приводится список поддерживаемых типов данных.See Limitations and Restrictions for a list of the supported data types.

ON [database_name.ON [database_name. [schema_name ] .[schema_name ] . | schema_name . | schema_name . ] table_name] table_name
Указывает одно-, двух- или трехкомпонентное имя таблицы, которая содержит индекс.Specifies the one-, two-, or three-part name of the table that contains the index.

Параметры WITHWITH options

DROP_EXISTING = [OFF] | ONDROP_EXISTING = [OFF] | ON

DROP_EXISTING = ON Существующий индекс удаляется и перестраивается.DROP_EXISTING = ON The existing index is dropped and rebuilt. Указанное имя индекса должно совпадать с уже существующим индексом, но определение индекса может быть изменено.The index name specified must be the same as a currently existing index; however, the index definition can be modified. Например, можно указать другие столбцы или параметры индекса.For example, you can specify different columns, or index options.

DROP_EXISTING = OFF Выдается ошибка, если индекс с указанным именем уже существует.DROP_EXISTING = OFF An error is displayed if the specified index name already exists. Тип индекса не может быть изменен с помощью аргумента DROP_EXISTING.The index type cannot be changed by using DROP_EXISTING. Для обратной совместимости синтаксиса аргумент WITH DROP_EXISTING эквивалентен аргументу WITH DROP_EXISTING = ON.In backward compatible syntax, WITH DROP_EXISTING is equivalent to WITH DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

Переопределяет параметр конфигурации сервера Максимальная степень параллелизма на время выполнения операции с индексами.Overrides the Configure the max degree of parallelism Server Configuration Option configuration option for the duration of the index operation. MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов.Use MAXDOP to limit the number of processors used in a parallel plan execution. Максимальное число процессоров — 64.The maximum is 64 processors.

Значения max_degree_of_parallelism могут быть следующими:max_degree_of_parallelism values can be:

  • 1 — подавляет создание параллельных планов.1 - Suppress parallel plan generation.
  • >1 — ограничивает максимальное число процессоров, используемых в параллельных операциях с индексами, заданным или меньшим числом в зависимости от текущей рабочей нагрузки системы.>1 - Restrict the maximum number of processors used in a parallel index operation to the specified number or fewer based on the current system workload. Например, если MAXDOP = 4, то число используемых процессоров будет равно 4 или меньше.For example, when MAXDOP = 4, the number of processors used is 4 or less.
  • 0 (по умолчанию) — в зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.0 (default) - Use the actual number of processors or fewer based on the current system workload.

Дополнительные сведения см. в статье Настройка параллельных операций с индексами.For more information, see Configure Parallel Index Operations.

Примечание

Параллельные операции с индексами доступны не во всех выпусках MicrosoftMicrosoftSQL ServerSQL Server.Parallel index operations are not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Сведения о функциях, поддерживаемых различными выпусками SQL ServerSQL Server, см. в статье Возможности, поддерживаемые различными выпусками 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.

ONLINE = [ON | OFF]ONLINE = [ON | OFF]
  • Значение ON указывает, что индекс columnstore остается в сети и доступен во время создания новой копии индекса.ON specifies that the columnstore index remains online and available while the new copy of the index is being built.
  • Значение OFF указывает, что индекс недоступен для использования во время создания новой копии.OFF specifies that the index is not available for use while the new copy is being built. В некластеризованных индексах базовая таблица остается доступной. Только некластеризованный индекс columnstore не используется для обработки запросов до создания индекса.In nonclustered index, the base table remains available, only the nonclustered columnstore index is not used to satisfy queries until the new index is complete.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate) WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | <delay>[минут]COMPRESSION_DELAY = 0 | <delay>[Minutes]

Задает нижнюю границу периода, в течение которого строка должна оставаться в разностной группе строк, прежде чем сможет переместиться в сжатую группу строк.Specifies a lower bound on how long a row should stay in delta rowgroup before it is eligible for migration to compressed rowgroup. Например, клиент может запросить возможность сжатия строки в формат хранения по столбцам, если она остается неизменной в течение 120 минут.For example, a customer can say that if a row is unchanged for 120 minutes, make it eligible for compressing into columnar storage format. Для индекса columnstore в таблицах на диске мы не отслеживаем время вставки или обновления строки, вместо этого мы используем время закрытия разностной группы строк для получения сведений о строке.For columnstore index on disk-based tables, we don't track the time when a row was inserted or updated, we use the delta rowgroup closed time as a proxy for the row instead. Значение по умолчанию — 0 минут.The default duration is 0 minutes. Строка переносится в хранилище по столбцам, когда в разностной группе строк накопится 1 миллион строк и она будет помечена как закрытая.A row is migrated to columnar storage once 1 million rows have been accumulated in delta rowgroup and it has been marked closed.

DATA_COMPRESSIONDATA_COMPRESSION

Задает режим сжатия данных для указанной таблицы, номера секции или диапазона секций.Specifies the data compression option for the specified table, partition number, or range of partitions. Применяется только к индексам columnstore, включая некластеризованные и кластеризованные индексы columnstore.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. Существуют следующие варианты выбора.The options are as follows:

  • COLUMNSTORE является значением по умолчанию и задает сжатие с использованием самого эффективного сжатия columnstore.COLUMNSTORE - the default and specifies to compress with the most performant columnstore compression. Это обычный вариант.This is the typical choice.
  • Параметр COLUMNSTORE_ARCHIVE обеспечивает дальнейшее сжатие таблицы или секции до еще меньшего размера.COLUMNSTORE_ARCHIVE - COLUMNSTORE_ARCHIVE further compresses the table or partition to a smaller size. Это может использоваться для архивации или в других ситуациях, где требуется уменьшение объема пространства и допускается увеличение затрат времени на сохранение и выборкуThis can be used for archival, or for other situations that require a smaller storage size and can afford more time for storage and retrieval.

Дополнительные сведения о сжатии см. в разделе Сжатие данных.For more information about compression, see Data Compression.

WHERE <filter_expression> [ AND <filter_expression> ]WHERE <filter_expression> [ AND <filter_expression> ]

Называется предикатом фильтра и задает строки для включения в индекс.Called a filter predicate, this specifies which rows to include in the index. SQL ServerSQL Server создает отфильтрованную статистику для строк данных отфильтрованного индекса.creates filtered statistics on the data rows in the filtered index.

Предикат фильтра использует простую логику сравнения.The filter predicate uses simple comparison logic. Сравнения с помощью литералов NULL с операторами сравнения недопустимы.Comparisons using NULL literals are not allowed with the comparison operators. Вместо этого используются операторы IS NULL и IS NOT NULL.Use the IS NULL and IS NOT NULL operators instead.

Далее приведено несколько примеров использования предикатов фильтра для таблицы 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

Рекомендации по отфильтрованным индексам см. в статье Создание отфильтрованных индексов.For guidance on filtered indexes, see Create Filtered Indexes.

Параметры ONON options

Эти параметры указывают файловые группы, для которых создается индекс.These options specify the filegroups on which the index is created.

имя_схемы_секционирования ( имя_столбца )partition_scheme_name ( column_name )
Задает схему секционирования, определяющую файловые группы, по которым сопоставляются секции секционированного индекса.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index is mapped. Схема секционирования должна быть создана в базе данных путем выполнения инструкции CREATE PARTITION SCHEME.The partition scheme must exist within the database by executing CREATE PARTITION SCHEME. column_name указывает столбец, по которому будет секционирован индекс.column_name specifies the column against which a partitioned index is partitioned. Столбец должен соответствовать по типу данных, длине и точности аргументу функции секционирования, используемой аргументом partition_scheme_name.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 необязательно должен соответствовать столбцам из определения индекса.column_name is not restricted to the columns in the index definition. При секционировании индекса columnstore компонент Компонент Database EngineDatabase Engine добавляет столбец секционирования как столбец индекса, если этого столбца еще нет в списке.When partitioning a columnstore index, Компонент Database EngineDatabase Engine adds the partitioning column as a column of the index, if it is not already specified.
Если аргумент partition_scheme_name или filegroup не задан и таблица секционирована, индекс помещается в ту же схему секционирования и с тем же столбцом секционирования, что и для базовой таблицы.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.
Индекс columnstore для секционированной таблицы должен быть выровнен по секциям.A columnstore index on a partitioned table must be partition aligned.
Дополнительные сведения о секционировании индексов см. в разделе Секционированные таблицы и индексы.For more information about partitioning indexes, see Partitioned Tables and Indexes.

filegroup_namefilegroup_name
Указывает имя файловой группы, в которой создается индекс.Specifies a filegroup name on which to create the index. Если имя filegroup_name не указано и таблица не секционирована, то индекс использует ту же файловую группу, что и базовая таблица.If filegroup_name is not specified and the table is not partitioned, the index uses the same filegroup as the underlying table. Файловая группа должна существовать.The filegroup must already exist.

" default "" default "
Создает заданный индекс в файловой группе, используемой по умолчанию.Creates the specified index on the default filegroup.

Слово "default" в этом контексте не является ключевым.The term default, in this context, is not a keyword. Это идентификатор установленной по умолчанию файловой группы, который должен иметь разделители, как в выражениях ON " default " или ON [ default ] .It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Если указано значение "default" (по умолчанию), параметр QUOTED_IDENTIFIER должен иметь значение ON для текущего сеанса.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Это параметр по умолчанию.This is the default setting. Дополнительные сведения см. в статье SET QUOTED_IDENTIFIER (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

PermissionsPermissions

Требуется разрешение ALTER на таблицу.Requires ALTER permission on the table.

Общие замечанияGeneral Remarks

Индекс columnstore может создаваться для временной таблицы.A columnstore index can be created on a temporary table. После удаления таблицы или окончания сеанса индекс также уничтожается.When the table is dropped or the session ends, the index is also dropped.

Упорядоченный кластеризованный индекс columnstore можно создавать для столбцов любых типов данных, поддерживаемых в Azure Synapse AnalyticsAzure Synapse Analytics, за исключением строковых столбцов.An ordered clustered columnstore index can be created on columns of any data types supported in Azure Synapse AnalyticsAzure Synapse Analytics except for string columns.

Отфильтрованные индексыFiltered Indexes

Отфильтрованный индекс является оптимизированным некластеризованным индексом, предназначенным для запросов, выбирающих небольшой процент строк таблицы.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. Чтобы проиндексировать часть данных таблицы, в нем используется предикат фильтра.It uses a filter predicate to index a portion of the data in the table. Правильно составленный отфильтрованный индекс может увеличить скорость выполнения запроса, уменьшить стоимость хранения и обслуживания.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

Обязательные параметры SET для отфильтрованных индексовRequired SET Options for Filtered Indexes

Параметры SET в столбце Required Value необходимы при возникновении любого из следующих условий.The SET options in the Required Value column are required whenever any of the following conditions occur:

  • Создание отфильтрованного индекса.Create a filtered index.

  • Операция INSERT, UPDATE, DELETE или MERGE изменяет данные в отфильтрованном индексе.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.

  • Отфильтрованный индекс используется оптимизатором запросов для создания плана запроса.The filtered index is used by the query optimizer to produce the query plan.

    Параметры SETSET options Обязательное значениеRequired value Значение сервера по умолчаниюDefault server value По умолчаниюDefault

    Значение OLE DB и ODBCOLE DB and ODBC value
    По умолчаниюDefault

    Значение 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

    *Если уровень совместимости базы данных равен 90 или более, при установке параметра ANSI_WARNINGS в состояние ON параметр ARITHABORT также устанавливается в состояние ON.*Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Если уровень совместимости базы данных установлен в состояние 80 или более раннее, то параметр ARITHABORT необходимо явным образом установить в состояние ON.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

Если параметры SET неверны, может произойти следующее.If the SET options are incorrect, the following conditions can occur:

  • Отфильтрованный индекс не будет создан.The filtered index is not created.

  • Компонент Компонент Database EngineDatabase Engine сформирует ошибку и выполнит откат любой инструкции INSERT, UPDATE, DELETE или MERGE, которая изменила значения данных в индексе.The Компонент Database EngineDatabase Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.

  • Оптимизатор запросов не учтет индекс в плане выполнения любой инструкции Transact-SQL.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

Дополнительные сведения об отфильтрованных индексах см. в статье Создание отфильтрованных индексов.For more information about Filtered Indexes, see Create Filtered Indexes.

ОграниченияLimitations and Restrictions

Каждый столбец в индексе columnstore должен иметь один из следующих типов общих бизнес-данных:Each column in a columnstore index must be of one of the following common business data types:

  • datetimeoffset [ ( n ) ]datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]datetime2 [ ( n ) ]
  • DATETIMEdatetime
  • smalldatetimesmalldatetime
  • Датаdate
  • time [ ( n ) ]time [ ( n ) ]
  • float [ ( n ) ]float [ ( n ) ]
  • real [ ( n ) ]real [ ( n ) ]
  • decimal [ ( precision [ , scale ] ) ]decimal [ ( precision [ , scale ] ) ]
  • numeric [ ( precision [ , scale ] ) ]numeric [ ( precision [ , scale ] ) ]
  • moneymoney
  • smallmoneysmallmoney
  • BIGINTbigint
  • INTint
  • smallintsmallint
  • tinyinttinyint
  • bitbit
  • nvarchar [ ( n ) ]nvarchar [ ( n ) ]
  • nvarchar(max) (применяется к SQL Server 2017 (14.x);SQL Server 2017 (14.x) и уровню "Премиум", уровню "Стандартный" (S3 и выше) и всем уровням предложений виртуальных ядер только в кластеризованных индексах columnstore)nvarchar(max) (Applies to SQL Server 2017 (14.x);SQL Server 2017 (14.x) and Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • nchar [ ( n ) ]nchar [ ( n ) ]
  • varchar [ ( n ) ]varchar [ ( n ) ]
  • varchar(max) (применяется к SQL Server 2017 (14.x);SQL Server 2017 (14.x) и уровню "Премиум", уровню "Стандартный" (S3 и выше) и всем уровням предложений виртуальных ядер только в кластеризованных индексах columnstore)varchar(max) (Applies to SQL Server 2017 (14.x);SQL Server 2017 (14.x) and Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • char [ ( n ) ]char [ ( n ) ]
  • varbinary [ ( n ) ]varbinary [ ( n ) ]
  • varbinary (max) (применяется к SQL Server 2017 (14.x);SQL Server 2017 (14.x) и базе данных SQL Azure на уровне "Премиум", уровне "Стандартный" (S3 и выше) и всех уровнях предложений виртуальных ядер только в кластеризованных индексах columnstore)varbinary (max) (Applies to SQL Server 2017 (14.x);SQL Server 2017 (14.x) and Azure SQL Database at Premium tier, Standard tier (S3 and above), and all VCore offerings tiers, in clustered columnstore indexes only)
  • binary [ ( n ) ]binary [ ( n ) ]
  • uniqueidentifier (область применения: SQL Server 2014 (12.x)SQL Server 2014 (12.x) и более поздние версии)uniqueidentifier (Applies to SQL Server 2014 (12.x)SQL Server 2014 (12.x) and later)

Ели в базовой таблице есть столбец с типом данных, не поддерживаемым для индексов columnstore, необходимо исключить этот столбец из некластеризованного индекса columnstore.If the underlying table has a column of a data type that is not supported for columnstore indexes, you must omit that column from the nonclustered columnstore index.

Столбцы, которые используют следующие типы данных, не могут быть включены в индекс columnstore:Columns that use any of the following data types cannot be included in a columnstore index:

  • ntext, text, и imagentext, text, and image
  • nvarchar(max), varchar(max) и varbinary(max) (область применения: SQL Server 2016 (13.x);SQL Server 2016 (13.x) и предыдущие версии и некластеризованные индексы columnstore)nvarchar(max), varchar(max), and varbinary(max) (Applies to SQL Server 2016 (13.x);SQL Server 2016 (13.x) and prior versions, and nonclustered columnstore indexes)
  • rowversion (и timestamp)rowversion (and timestamp)
  • sql_variantsql_variant
  • Типы CLR (hierarchyid и пространственные типы)CLR types (hierarchyid and spatial types)
  • Xmlxml
  • uniqueidentifier (область применения: SQL Server 2012 (11.x)SQL Server 2012 (11.x))uniqueidentifier (Applies to SQL Server 2012 (11.x)SQL Server 2012 (11.x))

Некластеризованные индексы columnstore:Nonclustered columnstore indexes:

  • Не более 1024 столбцов.Cannot have more than 1024 columns.
  • Невозможно создать как индексы на основе ограничений.Cannot be created as a constraint-based index. Таблица с индексом columnstore может иметь ограничения уникальности, ограничения первичного ключа и ограничения внешнего ключа.It is possible to have unique constraints, primary key constraints, and foreign key constraints on a table with a columnstore index. Ограничения всегда применяются с помощью индекса row-store.Constraints are always enforced with a row-store index. Ограничения невозможно применить с помощью индекса columnstore (кластеризованного или некластеризованного).Constraints cannot be enforced with a columnstore (clustered or nonclustered) index.
  • Не может содержать разреженный столбец.Cannot include a sparse column.
  • Не может быть изменено с использованием инструкции ALTER INDEX.Cannot be changed by using the ALTER INDEX statement. Чтобы изменить некластеризованный индекс, следует удалить и повторно создать индекс columnstore.To change the nonclustered index, you must drop and re-create the columnstore index instead. Инструкция ALTER INDEX позволяет отключить и перестроить индекс columnstore.You can use ALTER INDEX to disable and rebuild a columnstore index.
  • Не может быть создано с использованием ключевого слова INCLUDE.Cannot be created by using the INCLUDE keyword.
  • Нельзя включать ключевые слова ASC и DESC для сортировки индексов.Cannot include the ASC or DESC keywords for sorting the index. Индексы columnstore упорядочены в соответствии с алгоритмами сжатия.Columnstore indexes are ordered according to the compression algorithms. В результате сортировки можно потерять многие преимущества в производительности.Sorting would eliminate many of the performance benefits.
  • Нельзя включать столбцы больших объектов (LOB) типа nvarchar(max), varchar(max) и varbinary(max) в некластеризованные индексы columnstore.Cannot include large object (LOB) columns of type nvarchar(max), varchar(max), and varbinary(max) in nonclustered column store indexes. Только кластеризованные индексы columnstore поддерживают типы больших объектов, начиная с версии SQL Server 2017 (14.x);SQL Server 2017 (14.x) и базы данных SQL Azure на уровне "Премиум", уровне "Стандартный" (S3 и выше) и всех уровнях предложений виртуальных ядер.Only clustered columnstore indexes support LOB types, beginning in SQL Server 2017 (14.x);SQL Server 2017 (14.x) version and Azure SQL Database configured at Premium tier, Standard tier (S3 and above), and all VCore offerings tiers tier. Обратите внимание, что предыдущие версии не поддерживают типы больших объектов в кластеризованных и некластеризованных индексах columnstore.Note, prior versions do not support LOB types in clustered and nonclustered columnstore indexes.

Примечание

Начиная с версии SQL Server 2016 (13.x);SQL Server 2016 (13.x), вы можете создавать некластеризованный индекс columnstore для индексированного представления.Starting with SQL Server 2016 (13.x);SQL Server 2016 (13.x), you can create a nonclustered columnstore index on an indexed view.

Индексы columnstore нельзя использовать вместе со следующими функциями:Columnstore indexes cannot be combined with the following features:

  • вычисляемые столбцы;Computed columns. Начиная с SQL Server 2017 кластеризованный индекс columnstore может содержать нематериализованный вычисляемый столбец.Starting with SQL Server 2017, a clustered columnstore index can contain a non-persisted computed column. Однако в SQL Server 2017 кластеризованные индексы columnstore не могут содержать материализованные вычисляемые столбцы, и невозможно создать некластеризованные индексы в вычисляемых столбцах.However, in SQL Server 2017, clustered columnstore indexes cannot contain persisted computed columns, and you cannot created nonclustered indexes on computed columns.
  • Формат сжатия страниц и строк, а также хранения vardecimal (индекс columnstore уже сжат в другом формате).Page and row compression, and vardecimal storage format (A columnstore index is already compressed in a different format.)
  • РепликацияReplication
  • Файловый потокFilestream

Нельзя использовать курсоры или триггеры в таблице с кластеризованным индексом columnstore.You cannot use cursors or triggers on a table with a clustered columnstore index. Это ограничение не применяется к некластеризованным индексам columnstore. Курсоры и триггеры можно использовать в таблице с некластеризованным индексом columnstore.This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

Особые ограничения SQL Server 2014 (12.x)SQL Server 2014 (12.x)SQL Server 2014 (12.x)SQL Server 2014 (12.x) specific limitations
Эти ограничения применяются только к SQL Server 2014 (12.x)SQL Server 2014 (12.x).These limitations apply only to SQL Server 2014 (12.x)SQL Server 2014 (12.x). В этом выпуске мы представили обновляемые кластеризованные индексы columnstore.In this release, we introduced updateable clustered columnstore indexes. Некластеризованные индексы columnstore были доступны только для чтения.Nonclustered columnstore indexes were still read-only.

  • Отслеживание изменений.Change tracking. Отслеживание изменений невозможно использовать с индексами columnstore.You cannot use change tracking with columnstore indexes.
  • Система отслеживания измененных данных.Change data capture. Отслеживание измененных данных невозможно включить для таблиц с кластеризованным индексом columnstore.Change data capture cannot be enabled on tables with a clustered columnstore index. Начиная с SQL Server 2016 его можно включить для таблиц с некластеризованным индексом columnstore.Starting with SQL Server 2016, it can be enabled on tables with a non-clustered columnstore index.
  • Вторичные реплики для чтения.Readable secondary. Невозможно получить доступ к кластеризованному индексу columnstore (CCI) из вторичной реплики для чтения группы доступности AlwaysOn.You cannot access a clustered columnstore index (CCI) from a readable secondary of an Always OnReadable availability group. К некластеризованному индексу columnstore (NCCI) можно получить доступ из вторичной реплики для чтения.You can access a nonclustered columnstore index (NCCI) from a readable secondary.
  • Множественный активный результирующий набор (MARS).Multiple Active Result Sets (MARS). SQL Server 2014 (12.x)SQL Server 2014 (12.x) использует функцию MARS для установки подключений с доступом только для чтения с использованием таблиц с индексом columnstore.uses MARS for read-only connections to tables with a columnstore index. При этом SQL Server 2014 (12.x)SQL Server 2014 (12.x) не поддерживает функцию MARS для параллельного выполнения операций DML в таблице с индексом columnstore.However, SQL Server 2014 (12.x)SQL Server 2014 (12.x) does not support MARS for concurrent data manipulation language (DML) operations on a table with a columnstore index. В этом случае SQL ServerSQL Server завершает подключения и прерывает выполнение транзакций.When this occurs, SQL ServerSQL Server terminates the connections and aborts the transactions.
  • Некластеризованные индексы columnstore недопустимо создавать для представления или индексированного представления.Nonclustered columnstore indexes cannot be created on a view or indexed view.

Сведения о преимуществах в производительности и ограничениях индексов columnstore см. в статье Общие сведения об индексах columnstore.For information about the performance benefits and limitations of columnstore indexes, see Columnstore Indexes Overview.

МетаданныеMetadata

Все столбцы в индексе columnstore хранятся в метаданных как включенные столбцы.All of the columns in a columnstore index are stored in the metadata as included columns. Индекс columnstore не имеет ключевых столбцов.The columnstore index does not have key columns. Эти системные представления предоставляют сведения об индексах columnstore.These system views provide information about columnstore indexes.

Примеры преобразования таблицы rowstore в columnstoreExamples for converting a rowstore table to columnstore

A.A. Преобразование кучи в кластеризованный индекс columnstoreConvert a heap to a clustered columnstore index

В этом примере создается таблица как куча, затем преобразуется в кластеризованный индекс с именем columnstore cci_Simple.This example creates a table as a heap and then converts it to a clustered columnstore index named cci_Simple. В результате таблица rowstore становится таблицей columnstore.This changes the storage for the entire table from rowstore to columnstore.

CREATE TABLE SimpleTable(  
    ProductKey [INT] NOT NULL,   
    OrderDateKey [INT] NOT NULL,   
    DueDateKey [INT] NOT NULL,   
    ShipDateKey [INT] NOT NULL);  
GO  
CREATE CLUSTERED COLUMNSTORE INDEX cci_Simple ON SimpleTable;  
GO  

Б.B. Преобразование кластеризованного индекса в кластеризованный индекс columnstore с тем же именем.Convert a clustered index to a clustered columnstore index with the same name.

В этом примере создается таблица с кластеризованным индексом, затем демонстрируется синтаксис преобразования кластеризованного индекса в кластеризованный индекс columnstore.This example creates a table with clustered index, and then demonstrates the syntax of converting the clustered index to a clustered columnstore index. В результате таблица rowstore становится таблицей columnstore.This changes the storage for the entire table from rowstore to columnstore.

CREATE TABLE SimpleTable (  
    ProductKey [INT] NOT NULL,   
    OrderDateKey [INT] NOT NULL,   
    DueDateKey [INT] NOT NULL,   
    ShipDateKey [INT] NOT NULL);  
GO  
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);  
GO  
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON SimpleTable  
WITH (DROP_EXISTING = ON);  
GO  

В.C. Обработка некластеризованных индексов при преобразовании таблицы rowstore в индекс columnstore.Handle nonclustered indexes when converting a rowstore table to a columnstore index.

В этом примере показано, как обрабатывать некластеризованные индексы при преобразовании таблицы rowstore в индекс columnstore.This example shows how to handle nonclustered indexes when converting a rowstore table to a columnstore index. На самом деле, начиная с версии SQL Server 2016 (13.x);SQL Server 2016 (13.x) никаких специальных действий не требуется. SQL ServerSQL Server автоматически определяет и перестраивает некластеризованные индексы в новый кластеризованный индекс columnstore.Actually, beginning with SQL Server 2016 (13.x);SQL Server 2016 (13.x) no special action is required; SQL ServerSQL Server automatically defines and rebuilds the nonclustered indexes on the new clustered columnstore index.

Если вы хотите удалить некластеризованные индексы, используйте инструкцию DROP INDEX до создания индекса columnstore.If you want to drop the nonclustered indexes, use the DROP INDEX statement prior to creating the columnstore index. Параметр DROP EXISTING удаляет только преобразуемый кластеризованный индекс.The DROP EXISTING option only drops the clustered index that is being converted. Он не удаляет некластеризованные индексы.It does not drop the nonclustered indexes.

В SQL Server 2012 (11.x)SQL Server 2012 (11.x) и SQL Server 2014 (12.x)SQL Server 2014 (12.x) было невозможно создать некластеризованный индекс в индексе columnstore.In SQL Server 2012 (11.x)SQL Server 2012 (11.x) and SQL Server 2014 (12.x)SQL Server 2014 (12.x), you could not create a nonclustered index on a columnstore index. В этом примере показано, как в предыдущих выпусках необходимо было удалить некластеризованные индексы до создания индекса columnstore.This example shows how in previous releases you need to drop the nonclustered indexes before creating the columnstore index.

--Create the table for use with this example.  
CREATE TABLE SimpleTable (  
    ProductKey [INT] NOT NULL,   
    OrderDateKey [INT] NOT NULL,   
    DueDateKey [INT] NOT NULL,   
    ShipDateKey [INT] NOT NULL);  
GO  
  
--Create two nonclustered indexes for use with this example  
CREATE INDEX nc1_simple ON SimpleTable (OrderDateKey);  
CREATE INDEX nc2_simple ON SimpleTable (DueDateKey);   
GO  
  
--SQL Server 2012 and SQL Server 2014: you need to drop the nonclustered indexes  
--in order to create the columnstore index.   
  
DROP INDEX SimpleTable.nc1_simple;  
DROP INDEX SimpleTable.nc2_simple;  
  
--Convert the rowstore table to a columnstore index.  
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple ON SimpleTable;   
GO  

Г.D. Преобразование большой таблицы фактов из rowstore в columnstoreConvert a large fact table from rowstore to columnstore

В этом примере показано, как преобразовать большую таблицу фактов из таблицы rowstore в таблицу columnstore.This example explains how to convert a large fact table from a rowstore table to a columnstore table.

Преобразование таблицы rowstore в таблицу columnstore.To convert a rowstore table to a columnstore table.

  1. Сначала создается небольшая таблица для использования в этом примере.First, create a small table to use in this example.

    --Create a rowstore table with a clustered index and a nonclustered index.  
    CREATE TABLE MyFactTable (  
        ProductKey [INT] NOT NULL,  
        OrderDateKey [INT] NOT NULL,  
         DueDateKey [INT] NOT NULL,  
         ShipDateKey [INT] NOT NULL )  
    )  
    WITH (  
        CLUSTERED INDEX ( ProductKey )  
    );  
    
    --Add a nonclustered index.  
    CREATE INDEX my_index ON MyFactTable ( ProductKey, OrderDateKey );  
    
  2. Удалите все некластеризованные индексы из таблицы rowstore.Drop all nonclustered indexes from the rowstore table.

    --Drop all nonclustered indexes  
    DROP INDEX my_index ON MyFactTable;  
    
  3. Удалить кластеризованный индекс.Drop the clustered index.

    • Это следует делать только в том случае, если необходимо указать новое имя индекса при его преобразовании в кластеризованный индекс columnstore.Do this only if you want to specify a new name for the index when it is converted to a clustered columnstore index. Если не удалить кластеризованный индекс, новый кластеризованный индекс columnstore будет иметь то же имя.If you do not drop the clustered index, the new clustered columnstore index has the same name.

      Примечание

      Имя индекса может оказаться легче запомнить, если вы используете собственное имя.The name of the index might be easier to remember if you use your own name. Все кластеризованные индексы rowstore используют имя по умолчанию — ClusteredIndex_<GUID>.All rowstore clustered indexes use the default name which is 'ClusteredIndex_<GUID>'.

    --Process for dropping a clustered index.  
    --First, look up the name of the clustered rowstore index.  
    --Clustered rowstore indexes always use the DEFAULT name 'ClusteredIndex_<GUID>'.  
    SELECT i.name   
    FROM sys.indexes i   
    JOIN sys.tables t  
    ON ( i.type_desc = 'CLUSTERED' ) WHERE t.name = 'MyFactTable';  
    
    --Drop the clustered rowstore index.  
    DROP INDEX ClusteredIndex_d473567f7ea04d7aafcac5364c241e09 ON MyDimTable;  
    
  4. Преобразуйте таблицу rowstore в таблицу columnstore с кластеризованным индексом columnstore.Convert the rowstore table to a columnstore table with a clustered columnstore index.

    --Option 1: Convert to columnstore and name the new clustered columnstore index MyCCI.  
    CREATE CLUSTERED COLUMNSTORE INDEX MyCCI ON MyFactTable;  
    
    --Option 2: Convert to columnstore and use the rowstore clustered   
    --index name for the columnstore clustered index name.  
    --First, look up the name of the clustered rowstore index.  
    SELECT i.name   
    FROM sys.indexes i  
    JOIN sys.tables t   
    ON ( i.type_desc = 'CLUSTERED' )  
    WHERE t.name = 'MyFactTable';  
    
    --Second, create the clustered columnstore index and   
    --Replace ClusteredIndex_d473567f7ea04d7aafcac5364c241e09  
    --with the name of your clustered index.  
    CREATE CLUSTERED COLUMNSTORE INDEX   
    ClusteredIndex_d473567f7ea04d7aafcac5364c241e09  
     ON MyFactTable  
    WITH DROP_EXISTING = ON;  
    

Д.E. Преобразование таблицы columnstore в таблицу rowstore с кластеризованным индексомConvert a columnstore table to a rowstore table with a clustered index

Чтобы преобразовать таблицу columnstore в таблицу rowstore с кластеризованным индексом, используйте инструкцию CREATE INDEX с параметром DROP_EXISTING.To convert a columnstore table to a rowstore table with a clustered index, use the CREATE INDEX statement with the DROP_EXISTING option.

CREATE CLUSTERED INDEX ci_MyTable   
ON MyFactTable  
WITH ( DROP EXISTING = ON );  

Е.F. Преобразование таблицы columnstore в кучу rowstoreConvert a columnstore table to a rowstore heap

Чтобы преобразовать таблицу columnstore в кучу rowstore, просто удалите кластеризованный индекс columnstore.To convert a columnstore table to a rowstore heap, simply drop the clustered columnstore index.

DROP INDEX MyCCI   
ON MyFactTable;  

Ж.G. Дефрагментация путем перестроения всего кластеризованного индекса columnstoreDefragment by rebuilding the entire clustered columnstore index

Применимо к: SQL Server 2014 (12.x)SQL Server 2014 (12.x)Applies to: SQL Server 2014 (12.x)SQL Server 2014 (12.x)

Есть два способа полностью перестроить кластеризованный индекс columnstore.There are two ways to rebuild the full clustered columnstore index. Можно использовать инструкцию CREATE CLUSTERED COLUMNSTORE INDEX или ALTER INDEX (Transact-SQL) с параметром REBUILD.You can use CREATE CLUSTERED COLUMNSTORE INDEX, or ALTER INDEX (Transact-SQL) and the REBUILD option. Оба метода дают одинаковые результаты.Both methods achieve the same results.

Примечание

Начиная с SQL Server 2016 (13.x);SQL Server 2016 (13.x), используйте ALTER INDEX...REORGANIZE вместо перестраивания с помощью методов, описанных в этом примере.Starting with SQL Server 2016 (13.x);SQL Server 2016 (13.x), use ALTER INDEX...REORGANIZE instead of rebuilding with the methods described in this example.

--Determine the Clustered Columnstore Index name of MyDimTable.  
SELECT i.object_id, i.name, t.object_id, t.name   
FROM sys.indexes i   
JOIN sys.tables t  
ON (i.type_desc = 'CLUSTERED COLUMNSTORE')  
WHERE t.name = 'RowstoreDimTable';  
  
--Rebuild the entire index by using CREATE CLUSTERED INDEX.  
CREATE CLUSTERED COLUMNSTORE INDEX my_CCI   
ON MyFactTable  
WITH ( DROP_EXISTING = ON );  
  
--Rebuild the entire index by using ALTER INDEX and the REBUILD option.  
ALTER INDEX my_CCI  
ON MyFactTable  
REBUILD PARTITION = ALL  
WITH ( DROP_EXISTING = ON );  

Примеры некластеризованных индексов columnstoreExamples for nonclustered columnstore indexes

A.A. Создание индекса columnstore в качестве вторичного индекса в таблице rowstoreCreate a columnstore index as a secondary index on a rowstore table

В этом примере создается некластеризованный индекс в таблице rowstore.This example creates a nonclustered columnstore index on a rowstore table. В этом случае можно создать только один индекс columnstore.Only one columnstore index can be created in this situation. Индекс columnstore требует дополнительного места, поскольку содержит копию данных из таблицы rowstore.The columnstore index requires extra storage since it contains a copy of the data in the rowstore table. В этом примере показано, как создать простую таблицу и кластеризованный индекс, затем демонстрируется синтаксис создания некластеризованного индекса columnstore.This example creates a simple table and a clustered index, and then demonstrates the syntax of creating a nonclustered columnstore index.

CREATE TABLE SimpleTable  
(ProductKey [INT] NOT NULL,   
OrderDateKey [INT] NOT NULL,   
DueDateKey [INT] NOT NULL,   
ShipDateKey [INT] NOT NULL);  
GO  
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);  
GO  
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple  
ON SimpleTable  
(OrderDateKey, DueDateKey, ShipDateKey);  
GO  

Б.B. Создание простого некластеризованного индекса columnstore с использованием всех параметровCreate a simple nonclustered columnstore index using all options

В следующем примере демонстрируется синтаксис создания некластеризованного индекса columnstore с использованием всех параметров.The following example demonstrates the syntax of creating a nonclustered columnstore index by using all options.

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple  
ON SimpleTable  
(OrderDateKey, DueDateKey, ShipDateKey)  
WITH (DROP_EXISTING =  ON,   
    MAXDOP = 2)  
ON "default"  
GO  

Более сложный пример с использованием секционированных таблиц см. в разделе Общие сведения об индексах columnstore.For a more complex example using partitioned tables, see Columnstore Indexes Overview.

В.C. Создание некластеризованного индекса columnstore с предикатом фильтрацииCreate a nonclustered columnstore index with a filtered predicate

В следующем примере создается отфильтрованный некластеризованный индекс columnstore в таблице Production.BillOfMaterials в базе данных AdventureWorks2012AdventureWorks2012.The following example creates a filtered nonclustered columnstore index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. Предикат фильтра может включать столбцы, не являющиеся ключевыми в отфильтрованном индексе.The filter predicate can include columns that are not key columns in the filtered index. Предикат в примере выбирает только те строки, где EndDate не равно NULL.The predicate in this example selects only the rows where EndDate is non-NULL.

IF EXISTS (SELECT name FROM sys.indexes  
    WHERE name = N'FIBillOfMaterialsWithEndDate'   
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))  
DROP INDEX FIBillOfMaterialsWithEndDate  
    ON Production.BillOfMaterials;  
GO  
CREATE NONCLUSTERED COLUMNSTORE INDEX "FIBillOfMaterialsWithEndDate"  
    ON Production.BillOfMaterials (ComponentID, StartDate)  
    WHERE EndDate IS NOT NULL;  

Г.D. Изменение данных в некластеризованном индексе columnstoreChange the data in a nonclustered columnstore index

Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2014 (12.x)SQL Server 2014 (12.x).Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2014 (12.x)SQL Server 2014 (12.x).

После создания некластеризованного индекса columnstore в таблице нельзя непосредственно изменять данные в этой таблице.Once you create a nonclustered columnstore index on a table, you cannot directly modify the data in that table. Запрос с инструкциями INSERT, UPDATE, DELETE или MERGE завершится сбоем и вернет сообщение об ошибке.A query with INSERT, UPDATE, DELETE, or MERGE fails and returns an error message. Для добавления или изменения данных в таблице можно воспользоваться одним из следующих способов.To add or modify the data in the table, you can do one of the following:

  • Отключить или удалить индекс columnstore.Disable or drop the columnstore index. Затем можно обновлять данные в таблице.You can then update the data in the table. Если отключить индекс columnstore, то можно перестроить его после окончания обновления данных.If you disable the columnstore index, you can rebuild the columnstore index when you finish updating the data. Например,For example,

    ALTER INDEX mycolumnstoreindex ON mytable DISABLE;  
    -- update mytable --  
    ALTER INDEX mycolumnstoreindex on mytable REBUILD  
    
  • Загрузка данных в промежуточную таблицу, не имеющую индекса columnstore.Load data into a staging table that does not have a columnstore index. Создание индекса columnstore в промежуточной таблице.Build a columnstore index on the staging table. Переключение промежуточной таблицы в пустую секцию главной таблицы.Switch the staging table into an empty partition of the main table.

  • Переключение секции из таблицы с индексом columnstore в пустую промежуточную таблицу.Switch a partition from the table with the columnstore index into an empty staging table. Если в промежуточной таблице имеется индекс columnstore, отключите индекс columnstore.If there is a columnstore index on the staging table, disable the columnstore index. Выполните все обновления.Perform any updates. Постройте (или перестройте) индекс columnstore.Build (or rebuild) the columnstore index. Переключитесь с промежуточной таблицы обратно на (теперь пустую) секцию главной таблицы.Switch the staging table back into the (now empty) partition of the main table.

Примеры: Azure Synapse AnalyticsAzure Synapse Analytics и Параллельное хранилище данныхParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and Параллельное хранилище данныхParallel Data Warehouse

A.A. Преобразование кластеризованного индекса в кластеризованный индекс columnstoreChange a clustered index to a clustered columnstore index

С помощью инструкции CREATE CLUSTERED COLUMNSTORE INDEX с параметром DROP_EXISTING = ON выполняется:By using the CREATE CLUSTERED COLUMNSTORE INDEX statement with DROP_EXISTING = ON, you can:

  • Преобразование кластеризованного индекса в кластеризованный индекс columnstore.Change a clustered index into a clustered columnstore index.

  • Перестроение кластеризованного индекса columnstore.Rebuild a clustered columnstore index.

В этом примере создается таблица xDimProduct в виде таблицы rowstore с кластеризованным индексом, а затем используется инструкция CREATE CLUSTERED COLUMNSTORE INDEX для преобразования таблицы из rowstore в columnstore.This example creates the xDimProduct table as a rowstore table with a clustered index, and then uses CREATE CLUSTERED COLUMNSTORE INDEX to change the table from a rowstore table to a columnstore table.

-- Uses AdventureWorks  
  
IF EXISTS (SELECT name FROM sys.tables  
    WHERE name = N'xDimProduct'  
    AND object_id = OBJECT_ID (N'xDimProduct'))  
DROP TABLE xDimProduct;  
  
--Create a distributed table with a clustered index.  
CREATE TABLE xDimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey)  
WITH ( DISTRIBUTION = HASH(ProductKey),  
    CLUSTERED INDEX (ProductKey) )  
AS SELECT ProductKey, ProductAlternateKey, ProductSubcategoryKey FROM DimProduct;  
  
--Change the existing clustered index   
--to a clustered columnstore index with the same name.  
--Look up the name of the index before running this statement.  
CREATE CLUSTERED COLUMNSTORE INDEX <index_name>   
ON xdimProduct   
WITH ( DROP_EXISTING = ON );  

Б.B. Перестроение кластеризованного индекса columnstoreRebuild a clustered columnstore index

Этот пример основан на предыдущем примере. В нем используется инструкция CREATE CLUSTERED COLUMNSTORE INDEX для перестроения существующего кластеризованного индекса columnstore с именем cci_xDimProduct.Building on the previous example, this example uses CREATE CLUSTERED COLUMNSTORE INDEX to rebuild the existing clustered columnstore index called cci_xDimProduct.

--Rebuild the existing clustered columnstore index.  
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct   
ON xdimProduct   
WITH ( DROP_EXISTING = ON );  

В.C. Изменение кластеризованного индекса columnstoreChange the name of a clustered columnstore index

Чтобы изменить имя кластеризованного индекса columnstore, удалите существующий кластеризованный индекс columnstore, а затем заново создайте индекс с новым именем.To change the name of a clustered columnstore index, drop the existing clustered columnstore index, and then recreate the index with a new name.

Рекомендуется выполнять эту операцию только с небольшими или пустыми таблицами.We recommend only doing this operation with a small table or an empty table. Удаление большого кластеризованного индекса columnstore и его перестройка с другим именем занимает много времени.It takes a long time to drop a large clustered columnstore index and rebuild with a different name.

В этом примере удаляется кластеризованный индекс columnstore с именем cci_xDimProduct, взятый из предыдущего примера, а затем повторно создается кластеризованный индекс columnstore с именем mycci_xDimProduct.Using the cci_xDimProduct clustered columnstore index from the previous example, this example drops the cci_xDimProduct clustered columnstore index and then recreates the clustered columnstore index with the name mycci_xDimProduct.

--For illustration purposes, drop the clustered columnstore index.   
--The table continues to be distributed, but changes to a heap.  
DROP INDEX cci_xdimProduct ON xDimProduct;  
  
--Create a clustered index with a new name, mycci_xDimProduct.  
CREATE CLUSTERED COLUMNSTORE INDEX mycci_xDimProduct  
ON xdimProduct  
WITH ( DROP_EXISTING = OFF );  

Г.D. Преобразование таблицы columnstore в таблицу rowstore с кластеризованным индексомConvert a columnstore table to a rowstore table with a clustered index

Может возникнуть ситуация, в которой необходимо удалить кластеризованный индекс columnstore и создать кластеризованный индекс.There might be a situation for which you want to drop a clustered columnstore index and create a clustered index. При этом таблица будет сохранена в формате rowstore.This stores the table in rowstore format. В этом примере таблица columnstore преобразуется в таблицу rowstore с кластеризованным индексом с тем же именем.This example converts a columnstore table to a rowstore table with a clustered index with the same name. Данные не будут утеряны.None of the data is lost. Все данные переносятся в таблицу rowstore, а указанные столбцы становятся ключевыми столбцами в кластеризованном индексе.All data goes to the rowstore table and the columns listed becomes the key columns in the clustered index.

--Drop the clustered columnstore index and create a clustered rowstore index.   
--All of the columns are stored in the rowstore clustered index.   
--The columns listed are the included columns in the index.  
CREATE CLUSTERED INDEX cci_xDimProduct    
ON xdimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey, WeightUnitMeasureCode)  
WITH ( DROP_EXISTING = ON);  

Д.E. Преобразование таблицы columnstore обратно в кучу rowstoreConvert a columnstore table back to a rowstore heap

Используйте DROP INDEX (SQL Server PDW), чтобы удалить кластеризованный индекс columnstore и преобразовать таблицу в кучу rowstore.Use DROP INDEX (SQL Server PDW) to drop the clustered columnstore index and convert the table to a rowstore heap. В этом примере таблица cci_xDimProduct преобразуется в кучу rowstore.This example converts the cci_xDimProduct table to a rowstore heap. Таблица остается распределенной, но хранится в виде кучи.The table continues to be distributed, but is stored as a heap.

--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.  
DROP INDEX cci_xdimProduct ON xdimProduct;  

Е.F. Создание упорядоченного кластеризованного индекса columnstore в таблице без индексаCreate an ordered clustered columnstore index on a table with no index

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER ( SHIPDATE );

Ж.G. Преобразование кластеризованного индекса columnstore в упорядоченный кластеризованный индекс columnstoreConvert a clustered columnstore index to an ordered clustered columnstore index

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER ( SHIPDATE );
WITH (DROP_EXISTING = ON)

З.H. Добавление столбца в порядок упорядоченного кластеризованного индекса columnstoreAdd a column to the ordering of an ordered clustered columnstore index

-- The original ordered clustered columnstore index was ordered on SHIPDATE column only.  Add PRODUCTKEY column to the ordering.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER ( SHIPDATE, PRODUCTKEY );
WITH (DROP_EXISTING = ON)

И.I. Изменение порядковых номеров упорядоченных столбцовChange the ordinal of ordered columns

-- The original ordered clustered columnstore index was ordered on SHIPDATE, PRODUCTKEY.  Change the ordering to PRODUCTKEY, SHIPDATE.  
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER ( PRODUCTKEY,SHIPDATE );
WITH (DROP_EXISTING = ON)