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 / 229796
Accepted
Michael J Swart
Michael J Swart
Asked: 2019-02-15 13:28:56 +0800 CST2019-02-15 13:28:56 +0800 CST 2019-02-15 13:28:56 +0800 CST

Por que meus índices não clusterizados usam mais espaço quando excluo linhas?

  • 772

Eu tenho uma tabela grande com 7,5 bilhões de linhas e 5 índices. Quando excluo aproximadamente 10 milhões de linhas, percebo que os índices não clusterizados parecem aumentar o número de páginas em que estão armazenados.

Eu escrevi uma consulta dm_db_partition_statspara relatar a diferença (depois - antes) nas páginas:

dm_db_partition_stats deltas

O índice 1 é o índice clusterizado, o índice 2 é a chave primária. Os outros são não agrupados e não exclusivos.

Por que as páginas estão aumentando nesses índices não agrupados?
Eu esperava que os números, na pior das hipóteses, permanecessem os mesmos.
Vejo que os contadores de desempenho relatam um aumento nas divisões de página durante a exclusão.

Ao excluir, o registro fantasma precisa ser movido para outra página? Isso tem a ver com "singulares"?

Estamos no meio do lançamento do RCSI, mas agora o RCSI está desativado.

É um nó primário em um grupo de disponibilidade. Eu sei que o instantâneo é usado de alguma forma em secundários. Eu ficaria surpreso se isso fosse relevante. Eu pretendo investigar isso (procurando a saída da página dbcc) para saber mais. Aqui está esperando que alguém tenha visto algo semelhante.

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

1 respostas

  • Voted
  1. Best Answer
    Brent Ozar
    2019-02-15T14:10:52+08:002019-02-15T14:10:52+08:00

    Um cenário possível que me diverte muito:

    • As linhas foram gravadas originalmente quando o banco de dados não tinha o instantâneo confirmado de leitura (RCSI), o isolamento de instantâneo (SI) ou os grupos de disponibilidade (AGs) habilitados
    • RCSI ou SI foi habilitado ou o banco de dados foi adicionado a um Grupo de Disponibilidade
    • Durante as exclusões, um carimbo de data/hora de 14 bytes foi adicionado às linhas excluídas para oferecer suporte a leituras RCSI/SI/AG

    Como esse servidor é primário em um AG, ele é afetado da mesma forma que os secundários. As informações da versão são adicionadas à primária - as páginas de dados são exatamente as mesmas nas primárias e secundárias. Os secundários aproveitam o armazenamento de versão para fazer suas leituras enquanto as linhas estão sendo atualizadas pelo AG, mas os secundários não gravam suas próprias versões do carimbo de data/hora na página. Eles apenas herdam as versões do trabalho do primário.

    Para demonstrar o crescimento, peguei a exportação do banco de dados Stack Overflow (que não tem RCSI habilitado) e criei vários índices na tabela Posts. Verifiquei os tamanhos dos índices com sp_BlitzIndex @Mode = 2 (copiar/colar em uma planilha e limpar um pouco para maximizar a densidade das informações):

    sp_BlitzIndex antes

    Em seguida, excluí cerca de metade das linhas:

    BEGIN TRAN;
    DELETE dbo.Posts WHERE Id % 2 = 0;
    GO
    

    Curiosamente, enquanto as exclusões aconteciam, o arquivo de dados crescia para acomodar os timestamps também! O Relatório de uso de disco do SSMS mostra os eventos de crescimento - aqui está apenas o topo para ilustrar:

    Eventos de crescimento

    (Tenho que adorar uma demonstração em que as exclusões fazem o banco de dados crescer.) Enquanto a exclusão estava em execução, executei sp_BlitzIndex novamente. Observe que o índice clusterizado tem menos linhas, mas seu tamanho já aumentou cerca de 1,5 GB. Os índices não clusterizados em AcceptedAnswerId cresceram dramaticamente - eles são índices em um valor pequeno que é praticamente nulo, então seus tamanhos de índice quase dobraram!

    sp_BlitzIndex durante a exclusão

    Eu não tenho que esperar que a exclusão termine para provar isso, então vou parar a demonstração por aí. O ponto é: quando você faz grandes exclusões em uma tabela que foi implementada antes de RCSI, SI ou AGs serem habilitados, os índices (incluindo o clusterizado) podem realmente crescer para acomodar a adição do registro de data e hora do armazenamento de versão.

    • 33

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