Resolve index fragmentation by reorganizing or rebuilding indexes

  • 03/19/2020
  • 21 minutes to read
    • p
    • j
    • M
    • M
    • d
    • +11

Applies to: simSQL Server (todas as versões) SimAzure SQL Database SimAzure SQL Instância Gerenciada simAzure Sinapse Analytics simParallel Data Warehouse

Este artigo descreve como índice ocorre a desfragmentação e discute o seu impacto sobre o desempenho da consulta. Uma vez que você determinar a quantidade de fragmentação que existe para um índice, você pode desfragmentar um índice, reorganizando um índice ou reconstruindo um índice, executando comandos Transact-SQL em sua ferramenta de escolha ou usando SQL Server Management Studio.

visão geral da fragmentação do Índice

o que é a fragmentação do índice e por que eu deveria me importar com ele:

  • fragmentação existe quando os índices têm páginas nas quais a ordenação lógica dentro do índice, com base no valor chave do índice, não corresponde à ordenação física dentro das páginas do Índice.
  • O motor da Base de dados modifica automaticamente os índices sempre que as operações de inserção, actualização ou supressão são feitas aos dados subjacentes. Por exemplo, a adição de linhas em uma tabela pode fazer com que as páginas existentes em índices rowstore se dividam para dar espaço para a inserção de novos valores-chave. Ao longo do tempo estas modificações podem fazer com que as informações do Índice se tornem dispersas no banco de dados (fragmentadas). A fragmentação existe quando os índices têm páginas nas quais a ordenação lógica, baseada no valor-chave, não corresponde à ordenação física dentro do arquivo de dados.índices fortemente fragmentados podem degradar o desempenho da consulta porque é necessário um I/O adicional para localizar os dados para os quais o índice aponta. Mais E/S faz com que a sua aplicação responda lentamente, especialmente quando as operações de digitalização estão envolvidas.

detectando a quantidade de fragmentação

o primeiro passo para decidir qual o método de desfragmentação do índice a usar é analisar o índice para determinar o grau de fragmentação. Você detecta fragmentação de forma diferente para os índices rowstore e columnstore.

Nota

é especialmente importante rever o índice ou a fragmentação de heap após grandes quantidades de dados serem apagados. Para heaps, se houver atualizações frequentes, também pode ser necessário rever a fragmentação para evitar a proliferação de registros de encaminhamento. Para mais informações sobre heaps, consulte Heaps (tabelas sem índices agrupados).

detectando fragmentação dos índices rowstore

Usando sys.dm_db_index_physical_stat, você pode detectar fragmentação em um índice específico, todos os índices em uma tabela ou visualização indexada, todos os índices em uma base de dados, ou todos os índices em todas as bases de dados. Para os índices particionados, sys.dm_ DB_ index_ physical_stat também fornece informação de fragmentação para cada partição.

O conjunto de resultados devolvido pelo sys.dm_ DB_ index_ physical_stat inclui as seguintes colunas:

Coluna Descrição
avg_fragmentation_in_percent A porcentagem de fragmentação lógica (out-of-ordem de páginas no índice).
fragment_count o número de fragmentos (páginas de folhas fisicamente consecutivas) no índice.
avg_fragment_size_in_pages número médio de páginas num fragmento de um índice.

Após o grau de fragmentação é conhecido, utilize a tabela seguinte para determinar o melhor método para remover a fragmentação: ÍNDICE de REORGANIZAR ou ÍNDICE.

avg_fragmentation_in_percent value Corrective statement
> 5% and < = 30% 1 ALTER INDEX REORGANIZE
> 30% 1 ALTER INDEX REBUILD WITH (ONLINE = ON) 2

1 These values provide a rough guideline for determining the point at which you should switch between ALTER INDEX REORGANIZE e ALTER INDEX REBUILD. No entanto, os valores reais podem variar de caso para caso. É importante que você experimente para determinar o melhor limiar para o seu ambiente.

Tip

Por exemplo, se um dado índice é usado principalmente para operações de digitalização, a remoção da fragmentação pode melhorar o desempenho destas operações. O benefício de desempenho pode não ser perceptível para índices que são usados principalmente para operações de busca.da mesma forma, remover a fragmentação em um heap (uma tabela sem índice cluster) é especialmente útil para operações de varredura de índice não-cluster, mas tem pouco efeito em operações de pesquisa.

2 reconstruir um índice pode ser executado online ou offline. Reorganizar um índice é sempre executado online. Para conseguir disponibilidade semelhante à opção reorganizar, você deve reconstruir os índices online. Para mais informações, consulte INDEX e execute operações de Index on-line.índices

com fragmentação de menos de 5 por cento não precisam ser desfragmentados porque o benefício de remover uma quantidade tão pequena de fragmentação é quase sempre largamente superado pelo custo da CPU incorrido para reorganizar ou reconstruir o índice. Além disso, reconstruir ou reorganizar pequenos índices rowstore geralmente não reduz a fragmentação real.Até ao SQL Server 2014 (12.x), O motor de banco de Dados SQL Server aloca espaço usando extentos mistos. Por isso, as páginas de pequenos índices são, por vezes, armazenadas em camadas mistas. Os extentos mistos são compartilhados por até oito objetos, de modo que a fragmentação em um pequeno índice pode não ser reduzida depois de reorganizá-lo ou reconstruí-lo. Veja também considerações específicas para reconstruir os índices rowstore. Para mais informações sobre extentes, consulte as páginas e Extents Architecture Guide.

detectando a fragmentação dos índices columnstore

Usando sys.dm_db_column_store_row_ group_physical_stat, poderá determinar a percentagem de linhas apagadas num índice, o que é uma medida razoável para a fragmentação num grupo de linhas de um índice columnstore. Use esta informação para calcular a fragmentação em um índice específico, todos os índices em uma tabela, todos os índices em uma base de dados, ou todos os índices em todas as bases de dados.

O conjunto de resultados retornado por sys.dm_db_column_store_row_group_physical_stats inclui as seguintes colunas:

Coluna Descrição
total_rows Número de linhas físicas armazenadas no grupo de linhas. Para grupos de linhas comprimidas, isto inclui as linhas que são marcadas como apagadas.
deleted_rows número de linhas fisicamente armazenadas num grupo de linhas comprimidas que são marcadas para remoção. 0 para grupos de linhas que estão na loja delta.

Usar esta informação retornada para calcular o índice de fragmentação usando esta fórmula:

100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)

Após o grau de fragmentação do índice é conhecido, utilize a tabela seguinte para determinar o melhor método para remover a fragmentação: ÍNDICE de REORGANIZAR ou ÍNDICE.

computed fragmentation in percent value Applies to version Corrective statement
> = 20% SQL Server 2012 (11.x) and SQL Server 2014 (12.x) ALTER INDEX REBUILD
> = 20% Starting with SQL Server 2016 (13.x) ALTER INDEX REORGANIZAR

Para verificar a fragmentação de um rowstore índice utilizando o Transact-SQL

O exemplo a seguir localiza a média da porcentagem de fragmentação de todos os índices HumanResources.Employee tabela AdventureWorks2016 banco de dados.

SELECT a.object_id, object_name(a.object_id) AS TableName, a.index_id, name AS IndedxName, avg_fragmentation_in_percentFROM sys.dm_db_index_physical_stats (DB_ID (N'AdventureWorks2016_EXT') , OBJECT_ID(N'HumanResources.Employee') , NULL , NULL , NULL) AS aINNER JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;GO

a declaração anterior devolve um conjunto de resultados semelhante ao seguinte.

object_id TableName index_id IndexName avg_fragmentation_in_percent----------- ------------ ----------- ----------------------------------------------------- ------------------------------1557580587 Employee 1 PK_Employee_BusinessEntityID 01557580587 Employee 2 IX_Employee_OrganizationalNode 01557580587 Employee 3 IX_Employee_OrganizationalLevel_OrganizationalNode 01557580587 Employee 5 AK_Employee_LoginID 66.66666666666671557580587 Employee 6 AK_Employee_NationalIDNumber 501557580587 Employee 7 AK_Employee_rowguid 0(6 row(s) affected)

Para mais informações, veja sys.dm_db_index_physical_stat.

Para verificar a fragmentação de um índice columnstore usando o Transact-SQL

O exemplo a seguir localiza a média da porcentagem de fragmentação de todos os índices dbo.FactResellerSalesXL_CCI tabela AdventureWorksDW2016 banco de dados.

SELECT i.object_id, object_name(i.object_id) AS TableName, i.index_id, i.name AS IndexName, 100*(ISNULL(SUM(CSRowGroups.deleted_rows),0))/NULLIF(SUM(CSRowGroups.total_rows),0) AS 'Fragmentation'FROM sys.indexes AS i INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups ON i.object_id = CSRowGroups.object_id AND i.index_id = CSRowGroups.index_idWHERE object_name(i.object_id) = 'FactResellerSalesXL_CCI'GROUP BY i.object_id, i.index_id, i.nameORDER BY object_name(i.object_id), i.name;

a declaração anterior devolve um conjunto de resultados semelhante ao seguinte.

object_id TableName index_id IndexName Fragmentation----------- --------------------------- ----------- ------------------------------- ---------------114099447 FactResellerSalesXL_CCI 1 IndFactResellerSalesXL_CCI 0(1 row(s) affected)

Verificar o índice de fragmentação usando o SQL Server Management Studio

Nota

Management Studio não pode ser usado para calcular a fragmentação do columnstore índices no SQL Server e não pode ser usada para calcular a fragmentação dos índices em Banco de dados SQL Azure. Use o exemplo Transact-SQL anterior.

  1. no Explorador de objectos, expande a base de dados que contém a tabela na qual deseja verificar a fragmentação de um índice.
  2. expanda a pasta de tabelas.
  3. expanda a tabela na qual deseja verificar a fragmentação de um índice.
  4. expanda a pasta de índices.
  5. carregue com o botão direito no índice do qual deseja verificar a fragmentação e seleccionar as propriedades.
  6. em Seleccionar uma página, seleccione a fragmentação.

As seguintes informações estão disponíveis na página Fragmentação:

Valor Descrição
Página plenitude Indica a média plenitude das páginas de índice, como uma porcentagem. 100% significa que as páginas de índice estão completamente cheias. 50% significa que, em média, cada página de índice está meio cheia.
fragmentação Total a percentagem de fragmentação lógica. Indica o número de páginas de um índice que não estão armazenadas por ordem.
dimensão média da linha dimensão média de uma linha ao nível das folhas.
profundidade o número de níveis do Índice, incluindo o nível das folhas.
Forwarded records the number of records in a heap that have forward pointers to another data location. (Este estado ocorre durante uma atualização, quando não há espaço suficiente para armazenar a nova linha no local original.)
linhas fantasma o número de linhas que são marcadas como apagadas mas ainda não removidas. Estas linhas serão removidas por um tópico de limpeza, quando o servidor não estiver ocupado. Este valor não inclui as linhas que estão a ser retidas devido a uma transacção de isolamento instantâneo pendente.
tipo de índice tipo de índice. Os valores possíveis são o índice agrupado, o índice não obstruído e o XML primário. Tabelas também podem ser armazenadas como um heap (sem índices), mas então esta página de Propriedades do Índice Não pode ser aberta.
linhas ao nível das folhas o número de linhas ao nível das folhas.
comprimento máximo da linha o tamanho máximo da linha de nível de folha.
dimensão mínima da linha dimensão mínima da linha ao nível das folhas.
Páginas O número total de páginas de dados.
partição ID a partição ID da árvore B contendo o índice.
Version Ghost rows the number of ghost records that are being retained due to an outstanding snapshot isolation transaction.

os índices de Desfragmentação pela reconstrução ou reorganização de índice

desfragmentar um índice fragmentado usando um dos seguintes métodos:

  • Índice de reorganização
  • reconstrução de Índice

Nota

Para índices particionados construído em um esquema de partição, você pode usar um dos seguintes métodos em um índice completo ou em uma única partição de um índice.

reorganizar um índice

reorganizar um índice utiliza recursos mínimos do sistema e é uma operação online. Isto significa que os bloqueios de tabela de bloqueio a longo prazo não são mantidos e as consultas ou actualizações da tabela subjacente podem continuar durante a transacção ALTER INDEX REORGANIZE.

  • para os índices rowstore, o motor da Base de dados desfragmenta o nível de folhas de índices agrupados e não reclassificados nas tabelas e vistas, reordenando fisicamente as páginas ao nível da folha para corresponder à ordem lógica dos nós da folha (da esquerda para a direita). Reorganizar também compacta as páginas de índice com base no valor do fator de preenchimento do Índice. Para ver a configuração do factor de preenchimento, use sys.Index. Para exemplos de sintaxe, veja exemplos: Rowstore reorganize.

  • ao usar os índices columnstore, a loja delta pode acabar com vários pequenos grupos de linhas após a inserção, atualização e exclusão de dados ao longo do tempo. Reorganizar um índice de columnstore força Todos os grupos de linha para a columnstore, e então combina os grupos de linha em menos grupos de linha com mais linhas. A operação de reorganização também remove as linhas que foram removidas da colunstore. Reorganizar inicialmente requer recursos adicionais de CPU para comprimir os dados, o que pode retardar o desempenho global do sistema. No entanto, assim que os dados são comprimidos, o desempenho da consulta melhora. Para exemplos de sintaxe, veja exemplos: ColumnStore reorganize.

reconstruir um índice

reconstruir um índice cai e recria o índice. Dependendo do tipo de índice e versão do motor de banco de dados, uma operação de reconstrução pode ser feita online ou offline. Para a sintaxe T-SQL, consulte ALTER INDEX REBUILD

  • Para rowstore índices, reconstrução remove a fragmentação, recupera espaço em disco compactando-as páginas com base no especificada ou existente configuração do fator de preenchimento, e reordena as linhas do índice em páginas contíguas. Quando é especificado, todos os índices na tabela são retirados e reconstruídos em uma única transação. As restrições-chave estrangeiras não têm de ser suprimidas antecipadamente. Quando índices com 128 extentes ou mais são reconstruídos, o motor de banco de dados deferga as chamadas deallocations de página reais, e suas bloqueios associados, até após a transação commits. Para exemplos de sintaxe, veja exemplos: Rowstore reorganize.

  • para os índices da columnstore, a reconstrução remove a fragmentação, move todas as linhas para a columnstore, e recupera o espaço em disco, apagando fisicamente as linhas que foram logicamente apagadas da tabela.

    Tip

    A partir do servidor SQL 2016 (13.x), reconstruir o índice columnstore geralmente não é necessário, uma vez que REORGANIZE executa o essencial de uma reconstrução em segundo plano como uma operação online.

    para exemplos de sintaxe, veja exemplos: ColumnStore rebuild.

permissões

requer ALTER permissão na tabela ou vista. O usuário deve ser membro de pelo menos uma das seguintes funções:

  • db_ddladmin função de banco de dados 1
  • base de dados db_owner
  • sysadmin função de servidor

1db_ddladmin função de banco de dados é o menos privilegiado.

remover a fragmentação usando o SQL Server Management Studio

para reorganizar ou reconstruir um índice

  1. No Object Explorer, expandir a base de dados que contém a tabela na qual deseja reorganizar um índice.
  2. expanda a pasta de tabelas.
  3. expanda a tabela na qual deseja reorganizar um índice.
  4. expanda a pasta de índices.
  5. carregue com o botão direito no índice que deseja reorganizar e seleccionar reorganizar.
  6. na janela para reorganizar os índices, verifique se o índice correcto está nos índices a reorganizar a grelha e carregue em OK.
  7. seleccione a opção Compact large object column data para indicar que todas as páginas que contêm dados de objectos grandes (LOB) também são compactadas.clique em OK.

para reorganizar todos os índices numa tabela

  1. no Explorador de objectos, expandir a base de dados que contém a tabela na qual deseja reorganizar os índices.
  2. expanda a pasta de tabelas.
  3. expanda a tabela na qual deseja reorganizar os índices.
  4. carregue com o botão direito na pasta dos Índices e seleccione reorganizar tudo.
  5. na janela de reorganização dos índices, verifique se os índices correctos estão nos índices a reorganizar. Para remover um índice dos índices a serem reorganizados grade, selecione o índice e, em seguida, pressione a tecla Delete.
  6. seleccione a opção Compact large object column data para indicar que todas as páginas que contêm dados de objectos grandes (LOB) também são compactadas.clique em OK.

para reconstruir um índice

  1. no Explorador de objectos, expanda a base de dados que contém a tabela na qual deseja reorganizar um índice.
  2. expanda a pasta de tabelas.
  3. expanda a tabela na qual deseja reorganizar um índice.
  4. expanda a pasta de índices.carregue com o botão direito no índice que deseja reorganizar e seleccionar reconstruir.
  5. na janela para os índices de reconstrução, verifique se o índice correcto está nos índices a reconstruir a grelha e carregue em OK.
  6. seleccione a opção Compact large object column data para indicar que todas as páginas que contêm dados de objectos grandes (LOB) também são compactadas.clique em OK.

remover a fragmentação usando Transact-SQL

Nota

para mais exemplos sobre o uso de Transact-SQL para reconstruir ou reorganizar os índices, veja alterar exemplos de índices: Columnstore Indexes e alterar exemplos de índice: Rowstore Indexes.

Para reorganizar um índice fragmentado

O exemplo a seguir reorganiza o IX_Employee_OrganizationalLevel_OrganizationalNode índice HumanResources.Employee tabela AdventureWorks2016 banco de dados.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode ON HumanResources.Employee REORGANIZE;

O exemplo a seguir reorganiza o IndFactResellerSalesXL_CCI índice de columnstore no dbo.FactResellerSalesXL_CCI tabela AdventureWorksDW2016 banco de dados.

-- This command will force all CLOSED and OPEN rowgroups into the columnstore.ALTER INDEX IndFactResellerSalesXL_CCI ON FactResellerSalesXL_CCI REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

Para reorganizar todos os índices em uma tabela

O exemplo a seguir reorganiza todos os índices de HumanResources.Employee tabela AdventureWorks2016 banco de dados.

ALTER INDEX ALL ON HumanResources.Employee REORGANIZE;

Para recriar um índice fragmentado

O exemplo a seguir recria um índice único em Employee tabela AdventureWorks2016 banco de dados.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.EmployeeREBUILD;

Para reconstruir todos os índices em uma tabela

O exemplo a seguir reconstrói todos os índices associados com a tabela AdventureWorks2016 banco de dados usando o ALL palavra-chave. São especificadas três opções.

ALTER INDEX ALL ON Production.ProductREBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

para mais informações, ver ALTER INDEX (Transact-SQL).

Automatic index and statistics management

Leverage solutions such as Adaptive Index Defrag to automatically manage defragmentation and statistics updates for one or more databases. Este procedimento automaticamente escolhe se reconstruir ou reorganizar um índice de acordo com o seu nível de fragmentação, entre outros parâmetros, e atualizar estatísticas com um limiar linear.

Considerações específicas para a reconstrução de rowstore índices

Recriar um índice de cluster recria automaticamente qualquer índice não clusterizado que fazem referência a chave de cluster, se a física ou identificadores lógicos contidos no índice agrupado registros necessidade de mudar.

os seguintes cenários obrigam todos os índices não filtrados da rowstore numa tabela a serem reconstruídos automaticamente:

  • Criação de um índice de cluster em uma tabela
  • Remover um índice de cluster, o que faz com que a tabela a ser armazenada como uma pilha
  • Alterar a chave de cluster para incluir ou excluir colunas

os cenários A seguir não necessitam de todas rowstore índices não clusterizados para ser reconstruído automaticamente em uma tabela:

  • Reconstruir um índice agrupado exclusivo
  • Reconstruir um índice em cluster não exclusivo
  • Alterar o esquema de índice, como a aplicação de um esquema de particionamento para um índice agrupado ou mover o índice de cluster para um diferente grupo de arquivos

Importante

Um índice não pode ser reorganizada ou reconstruído se o grupo de arquivos no qual está localizado está off-line ou definido para só de leitura. Quando a palavra-chave é especificada e um ou mais índices estão em um filegroup offline ou apenas para leitura, a declaração falha.

enquanto uma reconstrução de índice ocorre, a mídia física deve ter espaço suficiente para armazenar duas cópias do Índice. Quando a reconstrução é concluída, o motor de banco de dados apaga o índice original.

Quando ALL é especificado com o ALTER INDEX instrução, índices relacionais, tanto agrupados e agrupados, e índices XML na tabela são reorganizados.

considerações específicas para reconstruir um índice de columnstore

ao reconstruir um índice de columnstore, o motor de banco de dados lê todos os dados do Índice de columnstore original, incluindo o delta store. Ele combina os dados em novos grupos de linha, e comprime os grupos de linha na colunstore. O motor de banco de dados desfragmenta a colunstore apagando fisicamente as linhas que foram logicamente apagadas da tabela. Os bytes apagados são recuperados no disco.

Nota

reorganizar um índice de columnstore usando o Management Studio irá combinar grupos de linhas comprimidos juntos, mas não obriga todos os grupos de linhas a serem comprimidos na columnstore. Os grupos de linhas fechados serão comprimidos mas os grupos de linhas abertos não serão comprimidos no columnstore.To comprimir à força Todos os grupos de linhas, usar o exemplo Transact-SQL abaixo.

Nota

começando com o servidor SQL 2019 (15.x), o movedor de tuplas é ajudado por uma tarefa de junção de fundo que comprime automaticamente os pequenos grupos de linhas do delta abertos que existiram por algum tempo, como determinado por um limiar interno, ou mescla grupos de linhas comprimidos de onde um grande número de linhas foi apagado. Isto melhora a qualidade do índice columnstore ao longo do tempo.
Para mais informações sobre termos e conceitos da columnstore, consulte os índices da Columnstore: Overview.

Recriar uma partição, em vez de toda a tabela

  • a Reconstrução de toda a tabela leva um longo tempo, se o índice é grande e requer espaço em disco suficiente para armazenar uma cópia adicional do índice durante a reconstrução. Normalmente, só é necessário reconstruir a partição mais recentemente usada.
  • Para tabelas particionadas, você não precisa reconstruir o índice inteiro da colunstore porque é provável que a fragmentação ocorra apenas nas partições que foram modificadas recentemente. Tabelas de fato e grandes tabelas de dimensão são geralmente particionadas, a fim de realizar operações de backup e gerenciamento em pedaços da tabela.

reconstruir uma partição após pesadas operações DML

reconstruir uma partição desfragmenta a partição e reduz o armazenamento em disco. A reconstrução apaga todas as linhas da colunstore que estão marcadas para remoção e move todos os grupos de linhas da loja delta para a colunstore. Pode haver vários grupos de linha na loja delta que têm menos de um milhão de linhas.

reconstruir uma partição após carregar dados

reconstruir uma partição após a data de carregamento garante que todos os dados são armazenados na colunstore. Quando processos simultâneos cada carga inferior a 100.000 linhas na mesma partição ao mesmo tempo, a partição pode acabar com múltiplas reservas de delta. A reconstrução move todas as linhas da delta store para a colunstore.

Considerations specific to reorganizing a columnstore index

When reorganizing a columnstore index, the Database Engine compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. A partir de SQL Server 2016 (13.x) e na Base de dados Azure SQL, o comando REORGANIZE executa as seguintes optimizações adicionais de desfragmentação:

  • fisicamente remove linhas de um grupo de linhas quando 10% ou mais das linhas foram apagadas logicamente. Os bytes apagados são recuperados na mídia física. Por exemplo, se um grupo de linhas comprimidas de 1 milhão de linhas tiver 100K removidas, o servidor de SQL irá remover as linhas apagadas e comprimir o grupo de linhas com 900k linhas. Grava no armazenamento, removendo as linhas apagadas.

  • combina um ou mais grupos de linhas comprimidos para aumentar as linhas por grupo de linhas até ao máximo de 1 048 576 linhas. Por exemplo, se você importar por grosso 5 lotes de 102,400 linhas, você terá 5 grupos de linhas comprimidos. Se você executar a reorganização, estes grupos de linhas serão reunidos em 1 grupo de linhas comprimidas do tamanho 512.000 linhas. Isto assume que não havia Tamanho de dicionário ou limitações de memória.

  • para grupos de linhas em que 10% ou mais das linhas foram apagadas logicamente, o motor da Base de dados tenta combinar este grupo de linhas com um ou mais grupos de linhas. Por exemplo, o rowgroup 1 é comprimido com 500.000 linhas e o rowgroup 21 é comprimido com o máximo de 1.048.576 linhas. O grupo 21 tem 60% das linhas apagadas, o que deixa 409,830 linhas. O motor de banco de dados favorece a combinação destes dois grupos de linhas para comprimir um novo grupo de linhas que tem 909.830 linhas.

após a realização de cargas de dados, poderá ter vários pequenos grupos de linhas na loja delta. Você pode usar ALTER INDEX REORGANIZE para forçar todos os grupos de linhas para a colunstore, e depois para combinar os grupos de linhas em menos grupos de linhas com mais linhas. A operação de reorganização também irá remover as linhas que foram apagadas da colunstore.

limitações e restrições

índices Rowstore com mais de 128 extentes são reconstruídas em duas fases separadas: lógica e física. Na fase lógica, as unidades de alocação existentes usadas pelo índice são marcadas para a desallocação, as linhas de dados são copiadas e ordenadas, em seguida, movidas para novas unidades de alocação criadas para armazenar o índice reconstruído. Na fase física, as unidades de alocação previamente marcadas para a desallocação são fisicamente descartadas em transações curtas que acontecem em segundo plano, e não requerem muitas Fechaduras. Para mais informações sobre extentos, consulte páginas e Extents Architecture Guide.

A declaração ALTER INDEX REORGANIZE requer que o arquivo de dados contendo o índice tenha espaço disponível, porque a operação só pode alocar páginas de trabalho temporário no mesmo arquivo, não em outro arquivo dentro do filegroup. Assim, embora o grupo de arquivos pode ter páginas livres disponíveis, o usuário ainda pode encontrar erro 1105: Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

Aviso

a Criação e recriação de índices não alinhados em uma tabela com mais de 1.000 partições é possível, mas não é suportado. Fazê-lo pode causar desempenho degradado ou consumo excessivo de memória durante estas operações. A Microsoft recomenda a utilização de apenas índices alinhados quando o número de partições exceder 1000.

um índice não pode ser reorganizado ou reconstruído se o filegroup em que ele está localizado estiver offline ou configurado apenas para leitura. Quando a palavra-chave é especificada e um ou mais índices estão em um filegroup offline ou apenas para leitura, a declaração falha.

Estatísticas:

  • Quando um índice é criado ou reconstruído, as Estatísticas são criadas ou actualizadas digitalizando todas as linhas da tabela. No entanto, começando com o SQL Server 2012 (11.x), as Estatísticas não são criadas ou atualizadas digitalizando todas as linhas da tabela quando um índice particionado é criado ou reconstruído. Em vez disso, o Otimizador de consulta usa o algoritmo de amostragem padrão para gerar essas estatísticas. Para obter estatísticas sobre índices particionados digitalizando todas as linhas da tabela, use criar estatísticas ou atualizar estatísticas com a cláusula FULLSCAN.

  • Quando um índice é reorganizado, as Estatísticas não são atualizadas.

um índice não pode ser reorganizado quando ALLOW_PAGE_LOCKS está programado para OFF.

até SQL Server 2017 (14.x), reconstruir um índice de colunstore é uma operação offline. O motor de banco de dados tem que adquirir um bloqueio exclusivo sobre a mesa ou partição enquanto a reconstrução ocorre. Os dados estão offline e indisponíveis durante a reconstrução, mesmo quando usando NOLOCK, isolamento instantâneo de leitura (RCSI), ou isolamento instantâneo.Começando com o servidor SQL 2019 (15.x), um índice de colunstore pode ser reconstruído usando a opção ONLINE = ON.

For an Azure Synapse Analytics (formerly Azure Synapse Analytics) table with an ordered cluster columnstore index, ALTER INDEX REBUILD will re-sort the data using TempDB. Monitorizar o TempDB durante as operações de reconstrução. Se precisar de mais espaço TempDB, aumente o armazém de dados. Reduz a escala assim que o índice estiver completo.

For an Azure Synapse Analytics (formerly Azure Synapse Analytics) table with an ordered cluster columnstore index, ALTER INDEX REORGANIZE does not re-sort the data. Para recorrer aos dados use ALTER INDEX REBUILD.

usando o INDEX REBUILD para se recuperar de falhas de hardware

nas versões anteriores do servidor SQL, você pode, por vezes, reconstruir um índice não obstruído rowstore para corrigir inconsistências causadas por falhas de hardware.Começando com o SQL Server 2008, você ainda pode ser capaz de reparar tais inconsistências entre o índice e o índice agrupado, reconstruindo um índice não-obstruído offline. No entanto, você não pode reparar inconsistências de índice não-cluster reconstruindo o índice online, porque o mecanismo de reconstrução online usa o índice não-cluster existente como base para a reconstrução e, assim, persistir a inconsistência. Reconstruir o índice offline pode às vezes forçar uma varredura do índice agrupado (ou heap) e assim remover a inconsistência. Para assegurar uma reconstrução a partir do índice agrupado, drop e recriar o índice não obstruído. Tal como acontece com versões anteriores, recomendamos a recuperação de inconsistências, restaurando os dados afetados a partir de um backup; no entanto, você pode ser capaz de reparar as inconsistências do Índice, reconstruindo o índice não obstruído offline. Para mais informações, consulte DBCC CHECKDB (Transact-SQL).

Veja também:

  • SQL Server Índice de Arquitetura e Design Guide
  • Executar Operações de Índice Online
  • ALTER INDEX (Transact-SQL)
  • Adaptável Índice de Desfragmentação
  • CRIAR ESTATÍSTICAS (Transact-SQL)
  • UPDATE STATISTICS (Transact-SQL)
  • Columnstore Índices de Desempenho de Consulta
  • Começar com Columnstore para operacionais em tempo real do google analytics
  • Columnstore Índices para armazenamento de Dados
  • Columnstore índices e a integração de políticas para rowgroups

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *