AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 232357
Accepted
Learning_DBAdmin
Learning_DBAdmin
Asked: 2019-03-18 01:17:31 +0800 CST2019-03-18 01:17:31 +0800 CST 2019-03-18 01:17:31 +0800 CST

Nível de Fragmentação para Heaps

  • 772

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 :

  1. 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.
  2. 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.

sql-server sql-server-2014
  • 1 1 respostas
  • 1054 Views

1 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2019-03-18T05:21:29+08:002019-03-18T05:21:29+08:00

    Os heaps têm alguns desafios especiais que você não pode experimentar com índices clusterizados:

    • Registros encaminhados
    • Páginas cativas

    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:

    • sp_BlitzIndex Índices de autodepreciação
    • Como corrigir registros encaminhados
    • Registros encaminhados misteriosos
    • Buscas encaminhadas e pesquisas de favoritos
    • 11

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve