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 / 5365
Accepted
Justin Dearing
Justin Dearing
Asked: 2011-09-03 12:57:15 +0800 CST2011-09-03 12:57:15 +0800 CST 2011-09-03 12:57:15 +0800 CST

Por que meu banco de dados ainda está fragmentado depois que reconstruí e reindexei tudo?

  • 772

Eu tenho um banco de dados que tentei desfragmentar todas as tabelas de uma só vez executando este T-SQL:

SELECT 
        'ALTER INDEX all ON ' + name + ' REORGANIZE;' + CHAR(10) +
        'ALTER INDEX all ON ' + name + ' REBUILD;'
    FROM sys.tables

E, em seguida, copiando e colando a saída em uma nova janela de consulta e executando isso. Não obtive erros, mas ainda tenho fragmentação. Eu tentei executar os dois comandos separadamente também e ainda tenho fragmentação. Nota: Fui informado de que REORGANIZEé desnecessário por Aaron e estou ciente de que poderia usar sql dinâmico para automatizar isso.

Eu executei isso para determinar que ainda tenho fragmentação:

SELECT * FROM 
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, NULL) 
WHERE avg_fragmentation_in_percent > 0

E eu consegui:

database_id object_id ID_índice número_partição index_type_desc alloc_unit_type_desc índice_profundidade nível_índice avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages contagem de páginas avg_page_space_used_in_percent Contagem de registros ghost_record_count version_ghost_record_count min_record_size_in_bytes max_record_size_in_bytes avg_record_size_in_bytes forward_record_count compact_page_count
85 171147655 1 1 ÍNDICE AGRUPADO IN_ROW_DATA 2 0 36.3636363636364 5 2.2 11 NULO NULO NULO NULO NULO NULO NULO NULO NULO
85 421576540 1 1 ÍNDICE AGRUPADO IN_ROW_DATA 2 0 75 7 1.14285714285714 8 NULO NULO NULO NULO NULO NULO NULO NULO NULO
85 965578478 1 1 ÍNDICE AGRUPADO IN_ROW_DATA 2 0 14.7058823529412 6 5.66666666666667 34 NULO NULO NULO NULO NULO NULO NULO NULO NULO
85 1061578820 1 1 ÍNDICE AGRUPADO IN_ROW_DATA 2 0 40 4 1,25 5 NULO NULO NULO NULO NULO NULO NULO NULO NULO
85 1109578991 1 1 ÍNDICE AGRUPADO IN_ROW_DATA 2 0 30.7692307692308 5 2.6 13 NULO NULO NULO NULO NULO NULO NULO NULO NULO
85 1205579333 2 1 ÍNDICE NÃO ASSOCIADO IN_ROW_DATA 2 0 50 5 1,6 8 NULO NULO NULO NULO NULO NULO NULO NULO NULO
85 1493580359 1 1 ÍNDICE AGRUPADO IN_ROW_DATA 2 0 50 6 1.66666666666667 10 NULO NULO NULO NULO NULO NULO NULO NULO NULO

Eu sei que estou perdendo algo bem básico, mas não sei o quê.

sql-server-2008 index
  • 4 4 respostas
  • 54584 Views

4 respostas

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-09-03T15:44:25+08:002011-09-03T15:44:25+08:00

    As mesas são minúsculas. As contagens de páginas em suas tabelas são:

    11, 8, 6, 5, 13, 8, 10

    Eles ocupam 480kb no total. Não há literalmente nada para desfragmentar.

    Edit: Isso merece um pouco mais de explicação.

    Uma nova tabela ou índice geralmente é alocado nas primeiras 8 páginas de uma extensão mista, em vez de uniforme. Portanto, é possível que cada uma das primeiras 8 páginas seja alocada de diferentes extensões mistas. Uma tabela ou índice que consome 8 páginas pode, portanto, ter 8 fragmentos, 1 em cada uma das 8 extensões mistas diferentes.

    Os scripts de desfragmentação mais usados ​​(alguns exemplos vinculados abaixo) tendem a excluir pequenas tabelas por causa disso. IIRC, <500 páginas está em um ou ambos. Nesses tamanhos, há muito pouco benefício na desfragmentação e os números de fragmentação são potencialmente distorcidos pelas alocações de extensão mista.

    • Ola Hallengren - Solução de manutenção do SQL Server
    • SQL Fool - Script de desfragmentação de índice
    • 39
  2. Marian
    2011-09-06T02:45:00+08:002011-09-06T02:45:00+08:00

    Citação de " Práticas recomendadas de desfragmentação de índice do Microsoft SQL Server 2000 ":

    "A fragmentação afeta a E/S do disco. Portanto, concentre-se nos índices maiores porque suas páginas são menos propensas a serem armazenadas em cache pelo SQL Server. Use a contagem de páginas relatada pelo DBCC SHOWCONTIG para ter uma ideia do tamanho dos índices (cada página é 8 KB de tamanho). Geralmente, você não deve se preocupar com níveis de fragmentação de índices com menos de 1.000 páginas. Nos testes, índices com mais de 10.000 páginas obtiveram ganhos de desempenho, com os maiores ganhos em índices com significativamente mais páginas (maior de 50.000 páginas) ."

    Então, isso meio que responde sua pergunta e respalda as respostas de Mark e Aaron.

    Você pode encontrar boas informações sobre fragmentação de índice nos seguintes artigos de Brent Ozar:

    • Descobertas da Fragmentação do Índice: Parte 1, O Básico
    • Descobertas de Fragmentação do Índice: Parte 2, O Tamanho Importa

    Além disso, um oceano de ótimas informações sobre índices em geral (também sobre questões de fragmentação) pode ser encontrado no blog de Kimberly Tripp .

    • 21
  3. Aaron Bertrand
    2011-09-03T16:47:02+08:002011-09-03T16:47:02+08:00

    Isso não é para responder à sua pergunta, mas nunca caberá em um comentário. Você pode construir este script dinamicamente sem ter que copiar e colar a saída em outra janela. Levando em conta que não há absolutamente nenhuma razão para REORGANIZEe então REBUILD:

    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += N'ALTER INDEX all ON ' + name + ' REBUILD;
        ' FROM sys.tables;
    
    PRINT @sql; -- to see the first 8,000 characters and make sure it checks out
    -- EXEC sp_executesql @sql;
    
    • 13
  4. Fernando V.
    2021-09-07T06:31:37+08:002021-09-07T06:31:37+08:00

    Eu acho que para reconstruir todos os índices você pode executar uma solução mais elegante, tente com

     EXEC sp_MSforeachtable ' ALTER INDEX ALL ON ? REBUILD'
    
    • -2

relate perguntas

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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