Compartilhar via


CREATE COLUMNSTORE INDEX (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Banco de Dados SQL no Microsoft Fabric

Converta uma tabela rowstore em um índice columnstore clusterizado ou crie um índice columnstore não clusterizado. Use um índice columnstore para executar com eficiência a análise operacional em tempo real em uma carga de trabalho OLTP ou para melhorar o desempenho de compactação de dados e consulta para cargas de trabalho de data warehousing.

Siga as novidades nos índices columnstore para obter as melhorias mais recentes para esse recurso.

  • Os índices columnstore clusterizados ordenados foram introduzidos no SQL Server 2022 (16.x). Para obter mais informações, consulte CREATE COLUMNSTORE INDEX. Para obter a disponibilidade de índices columnstore ordenados, confira Índices columnstore: visão geral.

  • 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 convertê-la em um índice columnstore clusterizado.

  • Para obter informações sobre as diretrizes de design de índice columnstore, consulte índices Columnstore – Diretrizes de design.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

-- 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 para 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 PDW (Azure Synapse Analytics and Analytics Platform System):

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 de 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:

Opção CLUSTERIZADO NÃO CLUSTERIZADO
COMPRESSION_DELAY SQL Server 2016 (13.x) SQL Server 2016 (13.x)
COMPRESSÃO_DE_DADOS 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ão aplicável SQL Server 2016 (13.x)
Cláusula ORDER SQL Server 2016 (13.x) Versão prévia do 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 de SQL do Azure.

Para obter mais detalhes sobre a disponibilidade do recurso, confira As novidades nos índices columnstore.

Argumentos

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 na tabela e armazena toda a tabela. Se a tabela existente for um índice clusterizado ou heap, 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 recriado.

Importante

No banco de dados SQL no Fabric, um índice columnstore clusterizado deve ser criado no mesmo lote ou transação da 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 usar a opção DROP EXISTING para especificar um novo nome.

ON [ 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 em um columnstore. Se a tabela já for um columnstore, essa instrução recriará o índice columnstore clusterizado.

ORDER para columnstore clusterizado

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

Para converter em um índice columnstore clusterizado ordenado, o índice existente deve ser um índice columnstore clusterizado. Use 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 clusterizado ordenado, use a opção MAXDOP = 1 para a classificação de maior 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 auxiliar consultas no índice columnstore.

Para obter a disponibilidade de índices columnstore ordenados, confira Índices columnstore: visão geral.

Opções WITH

DROP_EXISTING = [OFF] | EM

DROP_EXISTING = ON especifica remover 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 do índice especificado já existir.

MAXDOP = max_degree_of_parallelism

Essa 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 plano paralelo.
  • >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 a configuração do servidor: grau máximo de paralelismo e configurar operações de índice paralelo.

COMPRESSION_DELAY = 0 | delay [ MINUTES ]

Para uma tabela baseada em disco, o atraso especifica o número mínimo de minutos que um rowgroup delta no estado fechado deve permanecer no rowgroup delta. O SQL Server pode compactá-lo no rowgroup compactado. Como as tabelas baseadas em disco não acompanham os tempos de inserção e atualização em linhas individuais, o SQL Server aplica o atraso a rowgroups 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 ao 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, o número de partição ou o intervalo de partições especificados. As opções são as seguintes:

  • COLUMNSTORE é o padrão e especifica a compactação com a compactação columnstore mais performante. Essa opção é a escolha típica.
  • COLUMNSTORE_ARCHIVE compacta ainda mais a tabela ou a partição para um tamanho menor. Use essa opção para situações como arquivamento, que exige 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 = [ON | OFF]
  • 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 de 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á as configurações de partição ou 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 (Transact-SQL).

column_name especifica a coluna na 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 for 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 opção QUOTED_IDENTIFIER deve ser ON para a sessão atual. QUOTED_IDENTIFIER é ON por padrão. Para obter mais informações, confira SET QUOTED_IDENTIFIER (Transact-SQL).

CREATE [NONCLUSTERED] COLUMNSTORE INDEX

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álise em tempo real.

index_name

Especifica o nome do índice. index_name deve ser exclusivo dentro da tabela, mas não precisa ser exclusivo no 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 com suporte para índices columnstore. Consulte Limitações e restrições para uma lista dos tipos de dados com suporte.

ON [ 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 for nonclustered columnstore

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 em 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 segmento, especialmente com dados de cadeia de caracteres. Para obter mais informações, consulte Ajuste de desempenho com índices columnstore ordenados e índices Columnstore – Diretrizes de design. 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 não clusterizado ordenado, use as MAXDOP = 1 opções para a classificação de qualidade mais alta, 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 auxiliar consultas no índice columnstore.

Para obter a disponibilidade do índice columnstore ordenado, consulte Disponibilidade do índice de coluna ordenada.

Opções WITH

DROP_EXISTING = [OFF] | EM

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

DROP_EXISTING = OFF
Um erro será mostrado se o nome do índice especificado já existir. O tipo de índice não pode ser alterado usando DROP_EXISTING. Na 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: o grau máximo de opção de configuração 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 plano paralelo.
  • >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.

Observação

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 recursos compatíveis com as edições do SQL Server, consulte Edições e recursos com suporte do SQL Server 2022.

ONLINE = [ON | OFF]
  • 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 | delay [ MINUTES ]

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

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 fechado do rowgroup delta é usado como um proxy para a linha. A duração padrão é de 0 minutos. Uma linha é migrada para o armazenamento de colunas depois que 1 milhão de linhas se acumulam no rowgroup delta e é marcada como fechada.

COMPRESSÃO_DE_DADOS

Especifica a opção de compactação de dados para a tabela, o número de partição ou o intervalo de partições especificados. 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 a compactação com a compactação columnstore mais performante. Essa opção é a escolha típica.
  • COLUMNSTORE_ARCHIVE compacta ainda mais a tabela ou a 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.

WHERE <filter_expression> [ AND <filter_expression> ]

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

O predicado de 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 os IS NOT NULL operadores.

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 diretrizes 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 no banco de dados executando CREATE PARTITION SCHEME.

column_name especifica a coluna na 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 está restrito às colunas na definição de índice. Ao particionar um índice columnstore, o Mecanismo de Banco de Dados adicionará a coluna de particionamento como uma coluna do índice, se ainda não estiver especificado.

Se a tabela for 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 ser alinhado à partição. Para obter mais informações sobre índices de particionamento, 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 for particionada, o índice usará o mesmo grupo de arquivos que a tabela subjacente. O grupo de arquivos já deve existir.

"padrão"

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 deverá ser ON para a sessão atual, que é a configuração padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER.

Permissões

Requer a permissão ALTER na tabela.

Observações

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 do Fabric, as tabelas com índices columnstore clusterizados não são espelhadas no 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 reduzir os custos de manutenção.

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

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

  • Você cria 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 necessário Valor do servidor padrão Valor OLE DB e ODBC padrão Valor de DB-Library padrão
ANSI_NULLS LIGADO LIGADO LIGADO DESLIGADO
Preenchimento ANSI (ANSI_PADDING) LIGADO LIGADO LIGADO DESLIGADO
ANSI_WARNINGS 1 LIGADO LIGADO LIGADO DESLIGADO
ARITHABORT LIGADO LIGADO DESLIGADO DESLIGADO
CONCAT_NULL_YIELDS_NULL é uma configuração do SQL Server que determina que a concatenação envolvendo valores NULL resultará em NULL. LIGADO LIGADO LIGADO DESLIGADO
ARREDONDAMENTO_NUMÉRICO_ABORTAR DESLIGADO DESLIGADO DESLIGADO DESLIGADO
IDENTIFICADOR_COM_COTAS LIGADO LIGADO LIGADO DESLIGADO

1 A configuração 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 poderão 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 e restrições

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

  • datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • data e hora
  • smalldatetime
  • data
  • time [ ( n ) ]
  • float [ ( n ) ]
  • real [ ( n ) ]
  • decimal [ ( precisão [ , escala ] ] ]
  • numeric [ ( precision [ , scale ] ) ]
  • dinheiro
  • 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
  • binary [ ( n ) ]
  • uniqueidentifier2

1 Aplica-se ao SQL Server 2017 (14.x) e ao Banco de Dados SQL do Azure na camada Premium, à camada Standard (S3 e superior) e a 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 sem suporte para índices columnstore, você deverá omitir essa coluna do índice columnstore não clusterizado.

Dados lob (objeto grande) maiores que 8 quilobytes são armazenados em armazenamento LOB fora de linha, com apenas um ponteiro para o local físico armazenado dentro do 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.

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 (tipos hierárquicos e espaciais)
  • XML
  • uniqueidentifier2

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

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

Índices columnstore não clusterizados:

  • Não é possível ter mais de 1.024 colunas.
  • Não pode ser criado como um índice baseado em restrição. É 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 repositório 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 remover e recriar o índice columnstore. Você pode usar ALTER INDEX para desabilitar e recompilar um índice columnstore.
  • Não é possível criar usando a palavra-chave INCLUDE.
  • Não é possível especificar as ASC palavras-chave na DESC lista de colunas de índice. Os índices Columnstore são ordenados de acordo com os algoritmos de compactação.
  • No Banco de Dados SQL do Azure, o Banco de Dados SQL no Microsoft Fabric, oAUTD da Instância Gerenciada de SQL do Azure e a Visualização do SQL Server 2025 (17.x) podem ser ordenados incluindo a ORDER cláusula. Para obter mais informações, veja Ajuste 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. Somente índices columnstore clusterizados dão suporte a tipos LOB, começando na versão do SQL Server 2017 (14.x), banco de dados SQL do Azure (configurado na camada Premium, camada Standard (S3 e acima) e todas as camadas de ofertas do vCore). As versões anteriores não dão suporte a tipos 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 uma exibição indexada.

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.
  • Compactaçã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.
  • Fluxo de arquivos.

Você não pode 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 atualizáveis e clusterizados. Índices columnstore não clusterizados ainda são somente leitura.

  • Controle de alterações. Você não pode 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. Você não pode acessar um CCI (índice columnstore clusterizado) de um secundário legível de um grupo de disponibilidade legível Always On. Você pode acessar um NCCI (índice columnstore não clusterizado) de um secundário legível.
  • Mars (conjuntos de resultados ativos múltiplos). 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 dá suporte a esse recurso para operações de 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.
  • Índices columnstore não clusterizados não podem ser criados em uma exibição ou exibição indexada.

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

Metadados

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

Exemplos: converter tabela de rowstore em columnstore

Um. Converter um heap em um índice columnstore clusterizado

Este exemplo cria uma tabela como um heap e a converte 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 demonstra a sintaxe de converter o í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 remover 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), você não pode 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 remover 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 tabela pequena 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. Remova todos os índices não clusterizados da tabela rowstore. Talvez você queira criar scripts dos índices para criá-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, pesquise o nome do índice rowstore clusterizado existente. Na Etapa 1, definimos o nome do índice como IDX_CL_MyFactTable. Se o nome do índice não tiver sido 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 i
    INNER JOIN sys.tables t ON i.object_id = t.object_id
    WHERE i.type_desc = 'CLUSTERED'
    AND t.name = 'MyFactTable';
    

    Opção 1: remover o índice IDX_CL_MyFactTableclusterizado existente e converter 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 do í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 um heap 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 estreitos. 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 o rowgroup de índice Columnstore. Nas versões anteriores do SQL Server, você pode usar CREATE CLUSTERED COLUMNSTORE INDEX com DROP_EXISTING=ON ou ALTER INDEX (Transact-SQL) e a opção REBUILD. Ambos os métodos obtiveram 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 i
INNER JOIN sys.tables 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 para índices columnstore não clusterizados

Um. 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. Somente 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 demonstra a sintaxe de criar 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 não clusterizado básico usando todas as opções

O exemplo a seguir demonstra a sintaxe de criar 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 e não clusterizado na Production.BillOfMaterials tabela no AdventureWorks2022 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 em que 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) por meio do SQL Server 2014 (12.x).

No SQL Server 2014 (12.x) e em versões anteriores, depois de criar um índice columnstore não clusterizado em uma tabela, você não poderá 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:

  • Desabilite 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 ao terminar 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 intermediária. Mova a tabela de estágio 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, desabilite o índice columnstore. Execute todas as atualizações. Compile (ou recompile) o índice columnstore. Retorne a tabela de preparação para a partição (agora vazia) da tabela principal.

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

Um. 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 em um índice columnstore clusterizado.

  • Recompile 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 i
INNER JOIN sys.tables 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 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. Recompilar um índice columnstore clusterizado

Com base no exemplo anterior, este exemplo usa CREATE CLUSTERED COLUMNSTORE INDEX para recriar 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 recomeque o índice com um novo nome.

Recomendamos limitar essa operação a uma tabela pequena ou vazia. Leva muito tempo para remover um índice columnstore grande e clusterizado e recompilar 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 remover um índice columnstore clusterizado e criar um índice clusterizado. Quando você descarta 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 se tornam as colunas de 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 novamente em um heap rowstore

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

--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 abrange 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, veja Ajuste 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 à ordenação de um índice columnstore clusterizado ordenado

Você pode especificar uma ordem para as colunas em um índice columnstore. O índice columnstore ordenado original e clusterizado foi ordenado somente na SHIPDATE coluna. O exemplo a seguir adiciona a PRODUCTKEY coluna à ordenação. Para obter a disponibilidade de índices columnstore ordenados, confira Índices columnstore: visão geral.

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

Eu. Alterar o ordinal de colunas ordenadas

O índice columnstore ordenado original e clusterizado foi ordenado em SHIPDATE, PRODUCTKEY. O exemplo a seguir altera a ordenação para PRODUCTKEY, SHIPDATE. Para obter a disponibilidade de índices columnstore ordenados, confira Índices columnstore: visão geral.

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 qualidade máxima de classificação e a duração mais curta. Para obter a disponibilidade de índices columnstore ordenados, confira Índices columnstore: visão geral.

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