Partilhar via


CRIAR ÍNDICE COLUMNSTORE (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Converter uma tabela rowstore em um índice columnstore clusterizado ou criar um índice columnstore não clusterizado. Use um índice columnstore para executar com eficiência análises operacionais em tempo real em uma carga de trabalho OLTP ou para melhorar a compactação de dados e o desempenho de consultas para cargas de trabalho de data warehouse.

Siga o que há de novo nos índices columnstore para obter as melhorias mais recentes para esse recurso.

  • Índices columnstore clusterizados ordenados foram introduzidos no SQL Server 2022 (16.x). Para obter mais informações, consulte CREATE COLUMNSTORE INDEX. Para obter informações sobre a disponibilidade de índices columnstore ordenados, consulte Columnstore indexes: Overview.

  • A partir do SQL Server 2016 (13.x), você pode criar a tabela como um índice columnstore clusterizado. Não é mais necessário primeiro criar uma tabela rowstore e, em seguida, convertê-la em um índice columnstore clusterizado.

  • Para obter informações sobre diretrizes de design de índice columnstore, consulte Columnstore indexes - design guidance.

Transact-SQL convenções de sintaxe

Syntax

Sintaxe do Banco de Dados SQL do Azure e da Instância Gerenciada SQL do AzureAUTD:

-- 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 }
    [ ORDER (column [ , ...n ] ) ]
    [ 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 ] )
    [ ORDER (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 )

Sintaxe do SQL Server:

-- 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 ] ) ]
    [ ORDER (column [ , ...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 ] )
    [ ORDER (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 )

Sintaxe do Azure Synapse Analytics and Analytics Platform System (PDW):

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
[;]

Disponibilidade da versão

Algumas das opções não estão disponíveis em todas as versões do mecanismo de banco de dados. A tabela a seguir mostra as versões quando as opções são introduzidas em índices columnstore clusterizados e columnstore não clusterizados:

Option CLUSTERED NONCLUSTERED
COMPRESSION_DELAY SQL Server 2016 (13.x) SQL Server 2016 (13.x)
DATA_COMPRESSION SQL Server 2016 (13.x) SQL Server 2016 (13.x)
ONLINE SQL Server 2019 (15.x) SQL Server 2017 (14.x)
Cláusula WHERE N/A SQL Server 2016 (13.x)
Cláusula ORDER SQL Server 2016 (13.x) SQL Server 2025 (17.x)

Todas as opções estão disponíveis no Banco de Dados SQL do Azure e noAUTD da Instância Gerenciada SQL do Azure.

Para obter mais detalhes sobre a disponibilidade de recursos, consulte Novidades nos índices columnstore.

Arguments

CRIAR ÍNDICE COLUMNSTORE CLUSTERIZADO

Crie um índice columnstore clusterizado no qual todos os dados são compactados e armazenados por coluna. O índice inclui todas as colunas da tabela e armazena a tabela inteira. Se a tabela existente for um heap ou um índice clusterizado, ela será convertida em um índice columnstore clusterizado. Se a tabela já estiver armazenada como um índice columnstore clusterizado, o índice existente será descartado e reconstruído.

Important

No banco de dados SQL na malha, um índice columnstore clusterizado deve ser criado dentro do mesmo lote ou transação que a tabela à qual pertence. Adicionar um índice columnstore clusterizado a uma tabela depois que ele já tiver sido criado pode resultar no seguinte erro:

Msg 35354, Level 16, State 1, Line 63, The statement failed because a clustered columnstore index cannot be created on a table enabled for Change Feed. Consider disabling Change Feed and then creating the clustered columnstore index.

index_name

Especifica o nome do novo índice.

Se a tabela já tiver um índice columnstore clusterizado, você poderá especificar o mesmo nome que o índice existente ou poderá usar a opção DROP EXISTING para especificar um novo nome.

EM [ database_name. [ schema_name ] . | schema_name . ] table_name

Especifica o nome de uma, duas ou três partes da tabela a ser armazenada como um índice columnstore clusterizado. Se a tabela for um heap ou tiver um índice clusterizado, a tabela será convertida de um rowstore para um columnstore. Se a tabela já for um columnstore, essa instrução recriará o índice columnstore clusterizado.

ORDER para columnstore agrupado

Use a column_store_order_ordinal coluna no sys.index_columns para determinar a ordem das colunas para um índice columnstore clusterizado. A ordenação Columnstore ajuda na eliminação de segmentos, especialmente com dados de cadeia de caracteres. Para obter mais informações, consulte Ajuste de desempenho com índices columnstore ordenados e Columnstore indexes - diretrizes de design.

Para converter em um índice columnstore clusterizado ordenado, o índice existente deve ser um índice columnstore clusterizado. Utilize a opção DROP_EXISTING.

Os tipos de dados LOB (os tipos de dados de comprimento (máximo) não podem ser a chave de um índice columnstore clusterizado ordenado.

Ao criar um índice columnstore agrupado ordenado, use a MAXDOP = 1 opção para a classificação da mais alta qualidade, em troca de uma duração significativamente maior da CREATE INDEX instrução. Para criar o índice o mais rápido possível, não limite o MAXDOP. A mais alta qualidade de compactação e classificação pode ajudar as consultas no índice columnstore.

Para obter informações sobre a disponibilidade de índices columnstore ordenados, consulte Columnstore indexes: Overview.

COM opções

DROP_EXISTING = [DESLIGADO] | EM

DROP_EXISTING = ON Especifica para descartar o índice existente e criar um novo índice ColumnStore.

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

O padrão, DROP_EXISTING = OFF, espera que o nome do índice seja o mesmo que o nome existente. Ocorrerá um erro se o nome de índice especificado já existir.

MAXDOP = max_degree_of_parallelism

Esta opção pode substituir o grau máximo existente de configuração do servidor de paralelismo durante a operação de índice. Use MAXDOP para limitar o número de processadores usados em uma execução de plano paralelo. O máximo é de 64 processadores.

max_degree_of_parallelism valores podem ser:

  • 1, o que significa suprimir a geração de planos paralelos.
  • >1, o que significa restringir o número máximo de processadores usados em uma operação de índice paralelo ao número especificado, ou menos, com base na carga de trabalho atual do sistema. Por exemplo, quando MAXDOP = 4, o número de processadores usados é 4 ou menos.
  • 0 (padrão), o que significa usar o número real de processadores, ou menos, com base na carga de trabalho atual do sistema.
CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines WITH (MAXDOP = 2);

Para obter mais informações, consulte Configuração do servidor: grau máximo de paralelismo e Configurar operações de índice paralelo.

COMPRESSION_DELAY = 0 | atraso [ MINUTOS ]

Para uma tabela baseada em disco, delay especifica o número mínimo de minutos que um grupo de linhas delta no estado fechado deve permanecer no grupo de linhas delta. O SQL Server pode compactá-lo no grupo de linhas compactado. Como as tabelas baseadas em disco não controlam os tempos de inserção e atualização em linhas individuais, o SQL Server aplica o atraso a grupos de linhas delta no estado fechado.

O padrão é 0 minutos.

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

Para obter recomendações sobre quando usar COMPRESSION_DELAY, consulte Introdução aos índices columnstore para análise operacional em tempo real.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

Especifica a opção de compactação de dados para a tabela especificada, o número da partição ou o intervalo de partições. As opções são as seguintes:

  • COLUMNSTORE é o padrão e especifica para compactar com a compactação columnstore de maior desempenho. Esta opção é a escolha típica.
  • COLUMNSTORE_ARCHIVE comprime ainda mais a tabela ou partição para um tamanho menor. Use esta opção para situações como arquivamento, que requer um tamanho de armazenamento menor e pode dar mais tempo para armazenamento e recuperação.
CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);

Para obter mais informações sobre compactação, consulte Compactação de dados.

ONLINE = [ATIVADO | DESLIGADO]
  • ON Especifica que o índice columnstore permanece online e disponível, enquanto a nova cópia do índice está sendo criada.
  • OFF Especifica que o índice não está disponível para uso enquanto a nova cópia está sendo criada.
CREATE CLUSTERED COLUMNSTORE INDEX cci
    ON Sales.OrderLines WITH (ONLINE = ON);

Opções ON

Com essas opções, você pode especificar opções para armazenamento de dados, como um esquema de partição, um grupo de arquivos específico ou o grupo de arquivos padrão. Se a opção ON não for especificada, o índice usará a partição de configurações ou as configurações de grupo de arquivos da tabela existente.

partition_scheme_name ( column_name ) especifica o esquema de partição para a tabela. O esquema de partição já deve existir no banco de dados. Para criar o esquema de partição, consulte CREATE PARTITION SCHEME.

column_name especifica a coluna em relação à qual um índice particionado é particionado. Esta coluna deve corresponder ao tipo de dados, comprimento e precisão do argumento da função de partição que partition_scheme_name está usando.

filegroup_name especifica o grupo de arquivos para armazenar o índice columnstore clusterizado. Se nenhum local for especificado e a tabela não estiver particionada, o índice usará o mesmo grupo de arquivos que a tabela ou exibição subjacente. O grupo de arquivos já deve existir.

Para criar o índice no grupo de arquivos padrão, use "default" ou [default]. Se você especificar "default", a QUOTED_IDENTIFIER opção deve ser ON para a sessão atual. QUOTED_IDENTIFIER é ON por padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER.

CRIAR ÍNDICE COLUMNSTORE [NÃO CLUSTERIZADO]

Crie um índice columnstore não clusterizado em uma tabela rowstore armazenada como um heap ou índice clusterizado. O índice pode ter uma condição filtrada e não precisa incluir todas as colunas da tabela subjacente. O índice columnstore requer espaço suficiente para armazenar uma cópia dos dados. Você pode atualizar o índice e ele é atualizado à medida que a tabela subjacente é alterada. O índice columnstore não clusterizado em um índice clusterizado permite análises em tempo real.

index_name

Especifica o nome do índice. index_name deve ser exclusivo dentro da tabela, mas não precisa ser exclusivo dentro do banco de dados. Os nomes de índice devem seguir as regras de identificadores.

( coluna [ ,... n ] )

Especifica as colunas a serem armazenadas. Um índice columnstore não clusterizado é limitado a 1.024 colunas.

Cada coluna deve ser de um tipo de dados suportado para índices columnstore. Consulte Limitações e restrições para obter uma lista dos tipos de dados suportados.

EM [ database_name. [ schema_name ] . | schema_name . ] table_name

Especifica o nome de uma, duas ou três partes da tabela que contém o índice.

ORDER para columnstore não clusterizado

As colunas especificadas na ORDER cláusula para um índice columnstore não clusterizado devem ser um subconjunto das colunas de chave para o índice.

Use a column_store_order_ordinal coluna no sys.index_columns para determinar a ordem das colunas para um índice columnstore não clusterizado. A ordenação Columnstore ajuda na eliminação de segmentos, especialmente com dados de cadeia de caracteres. Para obter mais informações, consulte Ajuste de desempenho com índices columnstore ordenados e Columnstore indexes - diretrizes de design. As considerações de design e desempenho nesses artigos geralmente se aplicam a índices columnstore clusterizados e não clusterizados.

Os tipos de dados LOB (os tipos de dados de comprimento (máximo)) não podem ser a chave de um índice columnstore não clusterizado ordenado.

Ao criar um índice columnstore ordenado não clusterizado, use as MAXDOP = 1 opções para a classificação da mais alta qualidade, em troca de uma duração significativamente maior da CREATE INDEX instrução. Para criar o índice o mais rápido possível, não limite MAXDOP. A mais alta qualidade de compactação e classificação pode ajudar as consultas no índice columnstore.

Para ver a disponibilidade do índice columnstore ordenado, consulte Disponibilidade do índice columnstore ordenado.

COM opções

DROP_EXISTING = { DESLIGADO | EM }

  • DROP_EXISTING = ATIVADO

    O índice existente é descartado e reconstruído. O nome do índice especificado deve ser o mesmo que um índice existente no momento; no entanto, a definição do índice pode ser modificada. Por exemplo, você pode especificar colunas diferentes ou opções de índice.

  • DROP_EXISTING = DESLIGADO

    Um erro será mostrado se o nome do índice especificado já existir. O tipo de índice não pode ser alterado usando DROP_EXISTING. Em sintaxe compatível com versões anteriores, WITH DROP_EXISTING é equivalente a WITH DROP_EXISTING = ON.

MAXDOP = max_degree_of_parallelism

Substitui a configuração do servidor: opção de configuração de grau máximo de paralelismo durante a operação de índice. Use MAXDOP para limitar o número de processadores usados em uma execução de plano paralelo. O máximo é de 64 processadores.

max_degree_of_parallelism valores podem ser:

  • 1, o que significa suprimir a geração de planos paralelos.
  • >1, o que significa restringir o número máximo de processadores usados em uma operação de índice paralelo ao número especificado, ou menos, com base na carga de trabalho atual do sistema. Por exemplo, quando MAXDOP = 4, o número de processadores usados é 4 ou menos.
  • 0 (padrão), o que significa usar o número real de processadores ou menos com base na carga de trabalho atual do sistema.

Para obter mais informações, consulte Configurar operações de índice paralelo.

Note

As operações de índice paralelo não estão disponíveis em todas as edições do Microsoft SQL Server. Para obter uma lista de funcionalidades suportadas pelas edições do SQL Server, consulte Edições e funcionalidades suportadas do SQL Server 2022.

ONLINE = [ATIVADO | DESLIGADO]
  • ON Especifica que o índice columnstore permanece online e disponível, enquanto a nova cópia do índice está sendo criada.
  • OFF Especifica que o índice não está disponível para uso enquanto a nova cópia está sendo criada. Em um índice não clusterizado, a tabela base permanece disponível. Somente o índice columnstore não clusterizado não é usado para satisfazer consultas até que o novo índice seja concluído.
CREATE COLUMNSTORE INDEX ncci
    ON Sales.OrderLines(StockItemID, Quantity, UnitPrice, TaxRate) WITH (ONLINE = ON);
COMPRESSION_DELAY = 0 | atraso [ MINUTOS ]

Especifica um limite inferior sobre quanto tempo uma linha deve permanecer em um grupo de linhas delta, antes de ser qualificada para migração para um grupo de linhas compactado. Por exemplo, você pode dizer que, se uma linha permanecer inalterada por 120 minutos, essa linha será qualificada para compactação no formato de armazenamento colunar.

Para um índice columnstore em tabelas baseadas em disco, a hora em que uma linha foi inserida ou atualizada não é controlada. Em vez disso, o tempo de fechamento do grupo de linhas delta é usado como um proxy para a linha. A duração padrão é 0 minutos. Uma linha é migrada para o armazenamento colunar depois que 1 milhão de linhas se acumulam no grupo de linhas delta e é marcada como fechada.

DATA_COMPRESSION

Especifica a opção de compactação de dados para a tabela especificada, o número da partição ou o intervalo de partições. Aplica-se somente a índices columnstore, incluindo não clusterizados e clusterizados. As opções são as seguintes:

  • COLUMNSTORE é o padrão e especifica para compactar com a compactação columnstore de maior desempenho. Esta opção é a escolha típica.
  • COLUMNSTORE_ARCHIVE comprime ainda mais a tabela ou partição para um tamanho menor. Você pode usar essa opção para arquivamento ou para outras situações que exigem um tamanho de armazenamento menor e podem dar mais tempo para armazenamento e recuperação.

Para obter mais informações sobre compactação, consulte Compactação de dados.

ONDE filter_expression <> [ E <filter_expression> ]

Chamada de predicado de filtro, essa opção especifica quais linhas devem ser incluídas no índice. O SQL Server cria estatísticas filtradas nas linhas de dados no índice filtrado.

O predicado do filtro usa uma lógica de comparação simples. Comparações que usam NULL literais não são permitidas com os operadores de comparação. Em vez disso, use o e IS NULL operadoresIS NOT NULL.

Aqui estão alguns exemplos de predicados de filtro para a Production.BillOfMaterials tabela:

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

Para obter orientação sobre índices filtrados, consulte Criar índices filtrados.

Opções ON

As opções a seguir especificam os grupos de arquivos nos quais o índice é criado.

partition_scheme_name ( column_name )

Especifica o esquema de partição que define os grupos de arquivos nos quais as partições de um índice particionado são mapeadas. O esquema de partição deve existir dentro do banco de dados executando CREATE PARTITION SCHEME.

column_name especifica a coluna em relação à qual um índice particionado é particionado. Esta coluna deve corresponder ao tipo de dados, comprimento e precisão do argumento da função de partição que partition_scheme_name está usando. column_name não se restringe às colunas na definição de índice. Ao particionar um índice columnstore, o Mecanismo de Banco de Dados adiciona a coluna de particionamento como uma coluna do índice, se ainda não estiver especificado.

Se a tabela estiver particionada e partition_scheme_name ou grupo de arquivos não forem especificados, o índice será colocado no mesmo esquema de partição e usará a mesma coluna de particionamento que a tabela subjacente.

Um índice columnstore em uma tabela particionada deve estar alinhado à partição. Para obter mais informações sobre particionamento de índices, consulte Tabelas e índices particionados.

filegroup_name

Especifica um nome de grupo de arquivos no qual criar o índice. Se filegroup_name não for especificado e a tabela não estiver particionada, o índice usará o mesmo grupo de arquivos que a tabela subjacente. O grupo de arquivos já deve existir.

"default"

Cria o índice especificado no grupo de arquivos padrão.

O termo padrão, neste contexto, não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e deve ser delimitado, como em ON "default" ou ON [default]. Se "default" for especificado, a opção QUOTED_IDENTIFIER deve estar ATIVADA para a sessão atual, que é a configuração padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER.

Permissions

Requer permissão de alteração na tabela.

Remarks

Você pode criar um índice columnstore em uma tabela temporária. Quando a tabela é descartada ou a sessão termina, o índice também é descartado.

No banco de dados SQL de malha, as tabelas com índices columnstore clusterizados não são espelhadas para o Fabric OneLake.

Índices filtrados

Um índice filtrado é um índice otimizado e não clusterizado, adequado para consultas que selecionam uma pequena porcentagem de linhas de uma tabela. Ele usa um predicado de filtro para indexar uma parte dos dados na tabela. Um índice filtrado bem projetado pode melhorar o desempenho da consulta, reduzir os custos de armazenamento e os custos de manutenção.

Opções SET necessárias para índices filtrados

As opções SET na coluna de valores necessários são necessárias sempre que ocorrer qualquer uma das seguintes condições:

  • Criar um índice filtrado.
  • Uma operação INSERT, UPDATE, DELETE ou MERGE modifica os dados em um índice filtrado.
  • O otimizador de consulta usa o índice filtrado para produzir o plano de consulta.
Opções SET Valor obrigatório Valor padrão do servidor Valor OLE DB e ODBC padrão Valor de DB-Library padrão
ANSI_NULLS ON ON ON OFF
ANSI_PADDING ON ON ON OFF
ANSI_WARNINGS 1 ON ON ON OFF
ARITHABORT ON ON OFF OFF
CONCAT_NULL_YIELDS_NULL ON ON ON OFF
NUMERIC_ROUNDABORT OFF OFF OFF OFF
QUOTED_IDENTIFIER ON ON ON OFF

1 Definir ANSI_WARNINGS como ON define implicitamente ARITHABORT como ON quando o nível de compatibilidade do banco de dados é definido como 90 ou posterior. Se o nível de compatibilidade do banco de dados estiver definido como 80 ou anterior, você deverá definir explicitamente a opção ARITHABORT como ON.

Se as opções SET estiverem incorretas, as seguintes condições podem ocorrer:

  • O índice filtrado não é criado.

  • O Mecanismo de Banco de Dados gera um erro e reverte instruções INSERT, UPDATE, DELETE ou MERGE que alteram dados no índice.

  • O otimizador de consulta não considera o índice no plano de execução para nenhuma instrução Transact-SQL.

Para obter mais informações sobre índices filtrados, consulte Criar índices filtrados.

Limitações

Cada coluna em um índice columnstore deve ser de um dos seguintes tipos de dados corporativos comuns:

  • datatempodeslocado [ ( n ) ]
  • datetime2 [ ( n ) ]
  • datetime
  • smalldatetime
  • date
  • tempo [ ( n ) ]
  • flutuador [ ( n ) ]
  • real [ ( n ) ]
  • decimal [ ( precisão [ , escala ] ) ]
  • numérico [ ( precisão [ , escala ] ) ]
  • money
  • smallmoney
  • bigint
  • int
  • smallint
  • tinyint
  • bit
  • Nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ]
  • Varchar [ ( n ) ]
  • varchar(max)1
  • char [ ( n ) ]
  • Varbinary [ ( n ) ]
  • varbinary(max)1
  • binário [ ( n ) ]
  • uniqueidentifier2

1 Aplica-se ao SQL Server 2017 (14.x) e ao Banco de Dados SQL do Azure na camada Premium, na camada Standard (S3 e superior) e em todas as camadas de ofertas vCore, somente em índices columnstore clusterizados.

2 Aplica-se ao SQL Server 2014 (12.x) e versões posteriores.

Se a tabela subjacente tiver uma coluna de um tipo de dados que não é suportado para índices columnstore, você deve omitir essa coluna do índice columnstore não clusterizado.

Dados de objeto grande (LOB) maiores que 8 kilobytes são armazenados em armazenamento LOB fora de linha, com apenas um ponteiro para o local físico armazenado no segmento de coluna. O tamanho dos dados armazenados não é relatado em sys.column_store_segments, sys.column_store_dictionaries ou sys.dm_db_column_store_row_group_physical_stats.

As colunas que usam qualquer um dos seguintes tipos de dados não podem ser incluídas em um índice columnstore:

  • ntext, texto e imagem
  • nvarchar(max), varchar(max), e varbinary(max)1
  • rowversion (e carimbo de data/hora)
  • sql_variant
  • Tipos CLR (hierarchyid e tipos espaciais)
  • xml
  • uniqueidentifier2

1 Aplica-se ao SQL Server 2016 (13.x) e versões anteriores e a índices columnstore não clusterizados.

2 Aplica-se ao SQL Server 2012 (11.x).

Índices columnstore não clusterizados:

  • Não pode ter mais de 1.024 colunas.
  • Não pode ser criado como um índice baseado em restrições. É possível ter restrições exclusivas, restrições de chave primária e restrições de chave estrangeira em uma tabela com um índice columnstore. As restrições são sempre impostas com um índice de armazenamento de linhas. As restrições não podem ser impostas com um índice columnstore (clusterizado ou não clusterizado).
  • Não é possível incluir uma coluna esparsa.
  • Não é possível alterar usando a instrução ALTER INDEX. Para alterar o índice não clusterizado, você deve descartar e recriar o índice columnstore. Você pode usar ALTER INDEX para desabilitar e reconstruir um índice columnstore.
  • Não é possível criar usando a palavra-chave INCLUDE.
  • Não é possível especificar as ASC palavras-chave ou DESC na lista de colunas de índice. Os índices Columnstore são ordenados de acordo com os algoritmos de compressão.
  • No Azure SQL Database, a base de dados SQL no Microsoft Fabric, Azure SQL Managed InstanceAUTD e SQL Server 2025 (17.x) podem ser ordenadas incluindo a ORDER cláusula. Para obter mais informações, consulte Otimização de desempenho com índices columnstore ordenados.
  • Não é possível incluir colunas LOB do tipo nvarchar(max), varchar(max) e varbinary(max) em índices columnstore não clusterizados. Apenas os índices columnstore clusterizados dão suporte a tipos de LOB, começando na versão SQL Server 2017 (14.x), Banco de Dados SQL do Azure (configurado na camada Premium, camada Standard (S3 e superior) e todas as camadas de ofertas vCore). As versões anteriores não oferecem suporte a tipos de LOB em índices columnstore clusterizados e não clusterizados.
  • A partir do SQL Server 2016 (13.x), você pode criar um índice columnstore não clusterizado em um modo de exibição indexado.

Os índices Columnstore não podem ser combinados com os seguintes recursos:

  • Colunas computadas. A partir do SQL Server 2017 (14.x), um índice columnstore clusterizado pode conter uma coluna computada não persistente. No entanto, no SQL Server 2017 (14.x), os índices columnstore clusterizados não podem conter colunas computadas persistentes e você não pode criar índices não clusterizados em colunas computadas.
  • Compressão de página e linha e o formato de armazenamento vardecimal . (Um índice columnstore já está compactado em um formato diferente.)
  • Replicação com índices columnstore clusterizados. Há suporte para índices columnstore não clusterizados. Para obter mais informações, consulte sp_addarticle.
  • Filestream.

Não é possível usar cursores ou gatilhos em uma tabela com um índice columnstore clusterizado. Essa restrição não se aplica a índices columnstore não clusterizados. Você pode usar cursores e gatilhos em uma tabela com um índice columnstore não clusterizado.

Limitações específicas do SQL Server 2014 (12.x):

As limitações a seguir se aplicam somente ao SQL Server 2014 (12.x). Nesta versão, você pode usar índices columnstore clusterizados atualizáveis. Os índices columnstore não clusterizados ainda são somente leitura.

  • Controlo de alterações. Não é possível usar o controle de alterações com índices columnstore.
  • Alterar a captura de dados. Esse recurso não pode ser habilitado em tabelas com um índice columnstore clusterizado. A partir do SQL Server 2016 (13.x), a captura de dados de alteração pode ser habilitada em tabelas com um índice columnstore não clusterizado.
  • Secundário legível. Não é possível acessar um índice columnstore (CCI) clusterizado a partir de um secundário legível de um grupo de disponibilidade legível Always On. Você pode acessar um índice columnstore não clusterizado (NCCI) a partir de um secundário legível.
  • Vários conjuntos de resultados ativos (MARS). O SQL Server 2014 (12.x) usa esse recurso para conexões somente leitura com tabelas com um índice columnstore. No entanto, o SQL Server 2014 (12.x) não oferece suporte a esse recurso para operações DML (linguagem de manipulação de dados simultâneas) em uma tabela com um índice columnstore. Se você tentar usar o recurso para essa finalidade, o SQL Server encerrará as conexões e cancelará as transações.
  • Os índices columnstore não clusterizados não podem ser criados em um modo de exibição ou modo de exibição indexado.

Para obter informações sobre os benefícios e limitações de desempenho dos índices columnstore, consulte Columnstore indexes: visão geral.

Metadata

Todas as colunas em um índice columnstore são armazenadas nos metadados como colunas incluídas. O índice columnstore não tem colunas-chave. As seguintes exibições do sistema fornecem informações sobre índices columnstore:

Exemplos: converter tabela de rowstore em columnstore

A. Converter uma pilha em um índice columnstore clusterizado

Este exemplo cria uma tabela como um heap e, em seguida, converte-a em um índice columnstore clusterizado chamado cci_Simple. A criação do índice columnstore clusterizado altera o armazenamento de toda a tabela de rowstore para columnstore.

CREATE TABLE dbo.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 dbo.SimpleTable;
GO

B. Converter um índice clusterizado em um índice columnstore clusterizado com o mesmo nome

Este exemplo cria uma tabela com índice clusterizado e, em seguida, demonstra a sintaxe da conversão do índice clusterizado em um índice columnstore clusterizado. A criação do índice columnstore clusterizado altera o armazenamento de toda a tabela de rowstore para columnstore.

CREATE TABLE dbo.SimpleTable2
(
    ProductKey INT NOT NULL,
    OrderDateKey INT NOT NULL,
    DueDateKey INT NOT NULL,
    ShipDateKey INT NOT NULL
);
GO

CREATE CLUSTERED INDEX cl_simple
    ON dbo.SimpleTable2(ProductKey);
GO

CREATE CLUSTERED COLUMNSTORE INDEX cl_simple
    ON dbo.SimpleTable2 WITH (DROP_EXISTING = ON);
GO

C. Manipular índices não clusterizados ao converter uma tabela rowstore em um índice columnstore

Este exemplo mostra como lidar com índices não clusterizados quando você converte uma tabela rowstore em um índice columnstore. A partir do SQL Server 2016 (13.x), nenhuma ação especial é necessária. O SQL Server define e recria automaticamente os índices não clusterizados no novo índice columnstore clusterizado.

Se você quiser descartar os índices não clusterizados, use a instrução DROP INDEX antes de criar o índice columnstore. A opção DROP EXISTING descarta apenas o índice clusterizado que está sendo convertido. Ele não descarta os índices não clusterizados.

No SQL Server 2012 (11.x) e no SQL Server 2014 (12.x), não é possível criar um índice não clusterizado em um índice columnstore.

--Create the table for use with this example.
CREATE TABLE dbo.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 dbo.SimpleTable(OrderDateKey);
CREATE INDEX nc2_simple ON dbo.SimpleTable(DueDateKey);
GO

Somente para SQL Server 2012 (11.x) e SQL Server 2014 (12.x), você deve descartar os índices não clusterizados para criar o índice columnstore.

DROP INDEX dbo.SimpleTable.nc1_simple;
DROP INDEX dbo.SimpleTable.nc2_simple;

--Convert the rowstore table to a columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple
    ON dbo.SimpleTable;
GO

D. Converter uma tabela de fatos grande de rowstore em columnstore

Este exemplo explica como converter uma tabela de fatos grande de uma tabela rowstore em uma tabela columnstore.

  1. Crie uma pequena tabela para usar neste exemplo.

    --Create a rowstore table with a clustered index and a nonclustered index.
    CREATE TABLE dbo.MyFactTable
    (
        ProductKey INT NOT NULL,
        OrderDateKey INT NOT NULL,
        DueDateKey INT NOT NULL,
        ShipDateKey INT NOT NULL INDEX IDX_CL_MyFactTable CLUSTERED (ProductKey)
    );
    
    --Add a nonclustered index.
    CREATE INDEX my_index
        ON dbo.MyFactTable(ProductKey, OrderDateKey);
    
  2. Solte todos os índices não clusterizados da tabela rowstore. Talvez você queira criar scripts para os índices para recriá-los mais tarde.

    --Drop all nonclustered indexes
    DROP INDEX my_index
        ON dbo.MyFactTable;
    
  3. Converta a tabela rowstore em uma tabela columnstore com um índice columnstore clusterizado.

    Primeiro, procure o nome do índice de armazenamento de linhas clusterizado existente. Na Etapa 1, definimos o nome do índice como IDX_CL_MyFactTable. Se o nome do índice não foi especificado, ele recebeu um nome de índice exclusivo gerado automaticamente. Você pode recuperar o nome gerado automaticamente com a seguinte consulta de exemplo:

    SELECT i.object_id,
           i.name,
           t.object_id,
           t.name
    FROM sys.indexes AS i
         INNER JOIN sys.tables AS t
             ON i.object_id = t.object_id
    WHERE i.type_desc = 'CLUSTERED'
          AND t.name = 'MyFactTable';
    

    Opção 1: Solte o índice IDX_CL_MyFactTableclusterizado existente e converta MyFactTable em columnstore. Altere o nome do novo índice columnstore clusterizado.

    --Drop the clustered rowstore index.
    DROP INDEX [IDX_CL_MyFactTable]
        ON dbo.MyFactTable;
    GO
    
    --Create a new clustered columnstore index with the name MyCCI.
    CREATE CLUSTERED COLUMNSTORE INDEX IDX_CCL_MyFactTable
        ON dbo.MyFactTable;
    GO
    

    Opção 2: Converter em columnstore e reutilizar o nome de índice clusterizado rowstore existente.

    --Create the clustered columnstore index,
    --replacing the existing rowstore clustered index of the same name
    CREATE CLUSTERED COLUMNSTORE INDEX [IDX_CL_MyFactTable]
        ON dbo.MyFactTable WITH (DROP_EXISTING = ON);
    

E. Converter uma tabela columnstore em uma tabela rowstore com um índice clusterizado

Para converter uma tabela columnstore em uma tabela rowstore com um índice clusterizado, use a instrução CREATE INDEX com a opção DROP_EXISTING.

CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
    ON dbo.[MyFactTable](ProductKey) WITH (DROP_EXISTING = ON);

F. Converter uma tabela columnstore em uma pilha rowstore

Para converter uma tabela columnstore em um heap rowstore, solte o índice columnstore clusterizado. Isso normalmente não é recomendado, mas alguns podem ter usos restritos. Para obter mais informações sobre heaps, consulte Heaps (tabelas sem índices clusterizados).

DROP INDEX [IDX_CL_MyFactTable]
    ON dbo.[MyFactTable];

G. Desfragmentar reorganizando o índice columnstore

Há duas maneiras de manter o índice columnstore clusterizado. A partir do SQL Server 2016 (13.x), use ALTER INDEX...REORGANIZE em vez de REBUILD. Para obter mais informações, consulte Columnstore index rowgroup. Em versões anteriores do SQL Server, você pode usar CREATE CLUSTERED COLUMNSTORE INDEX com DROP_EXISTING=ON ou ALTER INDEX e a opção REBUILD. Ambos os métodos alcançaram os mesmos resultados.

Comece determinando o nome do índice columnstore clusterizado em MyFactTable.

SELECT i.object_id,
       i.name,
       t.object_id,
       t.name
FROM sys.indexes AS i
     INNER JOIN sys.tables AS t
         ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED COLUMNSTORE'
      AND t.name = 'MyFactTable';

Remova a fragmentação executando um REORGANIZE no índice columnstore.

--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
    ON dbo.[MyFactTable] REORGANIZE;

Exemplos de índices columnstore não clusterizados

A. Criar um índice columnstore como um índice secundário em uma tabela rowstore

Este exemplo cria um índice columnstore não clusterizado em uma tabela rowstore. Apenas um índice columnstore pode ser criado nessa situação. O índice columnstore requer armazenamento extra, pois contém uma cópia dos dados na tabela rowstore. Este exemplo cria uma tabela simples e um índice clusterizado rowstore e, em seguida, demonstra a sintaxe da criação de um índice columnstore não clusterizado.

CREATE TABLE dbo.SimpleTable
(
    ProductKey INT NOT NULL,
    OrderDateKey INT NOT NULL,
    DueDateKey INT NOT NULL,
    ShipDateKey INT NOT NULL
);
GO

CREATE CLUSTERED INDEX cl_simple
    ON dbo.SimpleTable(ProductKey);
GO

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
    ON dbo.SimpleTable(OrderDateKey, DueDateKey, ShipDateKey);
GO

B. Criar um índice columnstore básico não clusterizado usando todas as opções

O exemplo a seguir demonstra a sintaxe da criação de um índice columnstore não clusterizado no grupo de arquivos DEFAULT, especificando os graus máximos de paralelismo (MAXDOP) como 2.

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

C. Criar um índice columnstore não clusterizado com um predicado filtrado

O exemplo a seguir cria um índice columnstore filtrado Production.BillOfMaterials e não clusterizado na tabela do AdventureWorks2025 banco de dados de exemplo. O predicado de filtro pode incluir colunas que não são colunas chave no índice filtrado. O predicado neste exemplo seleciona apenas as linhas onde EndDate é não-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. Alterar os dados em um índice columnstore não clusterizado

Aplica-se a: SQL Server 2012 (11.x) a SQL Server 2014 (12.x).

No SQL Server 2014 (12.x) e versões anteriores, depois de criar um índice columnstore não clusterizado em uma tabela, você não pode modificar diretamente os dados nessa tabela. Uma consulta com INSERT, UPDATE, DELETE ou MERGE falha e retorna uma mensagem de erro. Aqui estão as opções que você pode usar para adicionar ou modificar os dados na tabela:

  • Desative ou solte o índice columnstore. Em seguida, você pode atualizar os dados na tabela. Se você desabilitar o índice columnstore, poderá reconstruir o índice columnstore quando concluir a atualização dos dados. Por exemplo:

    ALTER INDEX mycolumnstoreindex
        ON dbo.mytable DISABLE;
    
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex
        ON dbo.mytable REBUILD;
    
  • Carregue dados em uma tabela de preparo que não tenha um índice columnstore. Crie um índice columnstore na tabela de preparo. Alterne a tabela de preparo para uma partição vazia da tabela principal.

  • Alterne uma partição da tabela com o índice columnstore para uma tabela de preparo vazia. Se houver um índice columnstore na tabela de preparo, desative o índice columnstore. Execute quaisquer atualizações. Crie (ou reconstrua) o índice columnstore. Alterne a tabela de preparo de volta para a partição (agora vazia) da tabela principal.

Exemplos: Azure Synapse Analytics, Analytics Platform System (PDW)

A. Alterar um índice clusterizado para um índice columnstore clusterizado

Usando a instrução CREATE CLUSTERED COLUMNSTORE INDEX com DROP_EXISTING = ON, você pode:

  • Altere um índice clusterizado para um índice columnstore clusterizado.

  • Recrie um índice columnstore clusterizado.

Este exemplo cria a xDimProduct tabela como uma tabela rowstore com um índice clusterizado. Em seguida, o exemplo usa CREATE CLUSTERED COLUMNSTORE INDEX para alterar a tabela de uma tabela rowstore para uma tabela columnstore.

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

Procure o nome do índice clusterizado criado automaticamente para a nova tabela nos metadados do sistema, usando sys.indexes. Por exemplo:

SELECT i.object_id,
       i.name,
       t.object_id,
       t.name,
       i.type_desc
FROM sys.indexes AS i
     INNER JOIN sys.tables AS t
         ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED'
      AND t.name = 'xdimProduct';

Agora, você pode optar por:

  1. Solte o índice columnstore clusterizado existente com um nome criado automaticamente e, em seguida, crie um novo índice columnstore clusterizado com um nome definido pelo usuário.
  2. Solte e substitua o índice existente por um índice columnstore clusterizado, mantendo o mesmo nome gerado pelo sistema, como ClusteredIndex_1bd8af8797f7453182903cc68df48541.

Por exemplo:

--1. DROP the existing clustered columnstore index with an automatically-created name, for example:
DROP INDEX ClusteredIndex_1bd8af8797f7453182903cc68df48541
    ON xdimProduct;
GO

CREATE CLUSTERED COLUMNSTORE INDEX [<new_index_name>]
    ON xdimProduct;
GO

--Or,
--2. Change the existing clustered index to a clustered columnstore index with the same name.
CREATE CLUSTERED COLUMNSTORE INDEX [ClusteredIndex_1bd8af8797f7453182903cc68df48541]
    ON xdimProduct WITH (DROP_EXISTING = ON);
GO

B. Reconstruir um índice columnstore clusterizado

Com base no exemplo anterior, este exemplo usa CREATE CLUSTERED COLUMNSTORE INDEX para reconstruir o índice columnstore clusterizado existente, chamado cci_xDimProduct.

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

C. Alterar o nome de um índice columnstore clusterizado

Para alterar o nome de um índice columnstore clusterizado, solte o índice columnstore clusterizado existente e recrie o índice com um novo nome.

Recomendamos que você limite essa operação a uma tabela pequena ou vazia. Leva muito tempo para descartar um índice columnstore grande e clusterizado e reconstruir com um nome diferente.

Este exemplo faz referência ao cci_xDimProduct índice columnstore clusterizado do exemplo anterior. Este exemplo descarta o cci_xDimProduct índice columnstore clusterizado e recria o índice columnstore clusterizado com o nome 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. Converter uma tabela columnstore em uma tabela rowstore com um índice clusterizado

Pode haver uma situação para a qual você deseja descartar um índice columnstore clusterizado e criar um índice clusterizado. Quando você solta um índice columnstore clusterizado, a tabela é alterada para o formato rowstore. Este exemplo converte uma tabela columnstore em uma tabela rowstore com um índice clusterizado com o mesmo nome. Nenhum dos dados é perdido. Todos os dados vão para a tabela rowstore e as colunas listadas tornam-se as colunas chave no índice clusterizado.

--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. Converter uma tabela columnstore de volta em uma pilha de armazenamento de linha

Use DROP INDEX para descartar o índice columnstore clusterizado e converter a tabela em um heap rowstore. Este exemplo converte a cci_xDimProduct tabela em um heap de armazenamento de linhas. A tabela continua a ser distribuída, mas é armazenada como uma pilha.

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

F. Criar um índice columnstore clusterizado ordenado em uma tabela sem índice

Um índice columnstore não ordenado cobre todas as colunas por padrão, sem a necessidade de especificar uma lista de colunas. Um índice columnstore ordenado permite especificar a ordem das colunas. A lista não precisa incluir todas as colunas.

Para obter mais informações, consulte Otimização de desempenho com índices columnstore ordenados.

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

G. Converter um índice columnstore clusterizado em um índice columnstore clusterizado ordenado

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

H. Adicionar uma coluna à ordem de um índice columnstore clusterizado ordenado

Você pode especificar uma ordem para as colunas em um índice columnstore. O índice columnstore original ordenado e agrupado foi ordenado apenas na SHIPDATE coluna. O exemplo a seguir adiciona a PRODUCTKEY coluna à ordem. Para obter informações sobre a disponibilidade de índices columnstore ordenados, consulte Columnstore indexes: Overview.

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

I. Alterar o ordinal de colunas ordenadas

O índice columnstore original ordenado e agrupado foi ordenado em SHIPDATE, PRODUCTKEY. O exemplo a seguir altera a ordem para PRODUCTKEY, SHIPDATE. Para obter informações sobre a disponibilidade de índices columnstore ordenados, consulte Columnstore indexes: Overview.

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

J. Criar um índice columnstore clusterizado ordenado

Você pode criar um índice columnstore clusterizado com chaves de ordenação. Ao criar um índice columnstore clusterizado ordenado, você deve aplicar a dica MAXDOP = 1 de consulta para obter a máxima qualidade de classificação e a menor duração. Para obter informações sobre a disponibilidade de índices columnstore ordenados, consulte Columnstore indexes: Overview.

CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI]
    ON dbo.FactResellerSalesPartCategoryFull ORDER(EnglishProductSubcategoryName, EnglishProductName) WITH (MAXDOP = 1, DROP_EXISTING = ON);