Atualmente estou usando scripts fornecidos pelo Sr. Ola Hallengren para executar o trabalho de manutenção e ultimamente tenho notado que há muitas tabelas (heaps) o nível de fragmentação é alarmantemente alto e precisa ser analisado e tomado medidas. Eu verifiquei o FAQ no site e parece que seu script não suporta a reconstrução de heaps. Usei a consulta abaixo para encontrar o nível de fragmentação:
SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.alloc_unit_type_desc,
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID() and dbindexes.name is null
ORDER BY page_count desc, indexstats.avg_fragmentation_in_percent desc
Meu aplicativo é suportado pelo fornecedor e tenho me comunicado com eles para alterar esses heaps para tabelas e criar um índice clusterizado, mas ainda não produziu nenhum resultado significativo, pois eles definiram a chave primária como um índice não clusterizado exclusivo e também faz parte de chave estrangeira, então precisa mudar em muitos níveis antes de fazer qualquer alteração. Em primeiro lugar, levei muitos dias para explicar a diferença entre índice clusterizado e chave primária com índice exclusivo.
Também passei pelos ajustes sugeridos pelo Sr. Brent Ozar para alterar os padrões no script fornecido pelo Sr. Ola Hallengren para otimizar o índice a fim de torná-lo mais eficiente, mas não encontrei nenhum detalhe da reconstrução do heap.
De acordo com meu entendimento, a fragmentação do heap pode ser tratada de duas maneiras, conforme descrito aqui :
- Para criar um índice clusterizado na tabela e eliminá-lo - Isso limparia toda a fragmentação e também reconstruiria todo o índice não clusterizado, mas consumiria tempo e E/S.
- Reconstruindo o heap - Isso também limparia a fragmentação e reconstruiria toda a parte do índice não clusterizado da reconstrução da tabela.
Não posso optar pela opção 1 porque não estou ciente das colunas em que o índice clusterizado pode ser criado e também isso pode levar mais tempo do que a opção 2.
Estou procurando a possibilidade de implementar a opção 1 nos scripts de Ola Hallengren ou um método alternativo para lidar com isso. Além disso, gostaria de reconstruir meus heaps apenas quando o tamanho do heap for superior a 10.000 páginas e o nível de fragmentação for superior a 80.
Estou usando o Microsoft SQL Server 2014 SP3 Enterprise Edition.
Como um DBA - eu não prefiro ter heaps no meu banco de dados, no entanto, como é um aplicativo suportado pelo fornecedor e já que eles já definiram a chave primária como índice exclusivo e essas chaves são chaves estrangeiras, é muito difícil alterá-las para cluster devido a referências, bem como a probabilidade de tempo de inatividade.
EDIT: Passei pelo link fornecido pelo Sr. Erik Darling e posso confirmar que tenho vários heaps com registros encaminhados ou exclusões nos bancos de dados. Agora, estou de volta ao ponto de onde eu tinha começado, ou seja, com essas duas opções. Como mencionei anteriormente, criar um índice clusterizado é muito difícil no meu cenário e exigirá pelo menos meses (ser otimista) com probabilidade de tempo de inatividade considerando a estrutura de chave estrangeira complexa. Precisa de conselhos sobre a reconstrução dos montes e possível efeito colateral.
Os heaps têm alguns desafios especiais que você não pode experimentar com índices clusterizados:
Eu sugiro executar sp_BlitzIndex em seu banco de dados para descobrir se alguma dessas coisas está acontecendo com seus Heaps. Se não, então deixe-os em paz. Se forem, talvez seja necessário considerar reconstruí-los.
Neste momento, você não pode reorganizar uma tabela Heap e reconstruir uma tabela Heap também reconstruirá todos os índices não clusterizados nela. Pode ser mais barato eliminá-los, reconstruir a tabela Heap e, em seguida, recriar os índices não clusterizados posteriormente.
Você pode ler mais sobre essas coisas aqui: