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 / 334815
Accepted
vacip
vacip
Asked: 2024-01-13 16:30:37 +0800 CST2024-01-13 16:30:37 +0800 CST 2024-01-13 16:30:37 +0800 CST

Reconstrução do índice SQL do Azure após enorme redução de tamanho

  • 772

Temos uma tabela em um banco de dados SQL do Azure que costumava ter uma coluna nvarchar(max) armazenando arquivos PDF. (As maravilhas dos desenvolvedores externos.) A mesa cresceu para 156 GB. Possui 476.000 linhas. Depois de mudar a lógica, não precisamos mais da coluna pdf. A única maneira razoável de se livrar dos dados contidos nela era descartar a coluna e recriá-la (caso algum processo estranho ainda estivesse fazendo referência a ela).

No entanto, o tamanho da tabela ainda é relatado como 156 GB. A tabela de backup que acabei de criar (SELECT INTO) tem 128 MB, então esse parece ser o tamanho real dos dados.

Deixei uma reconstrução de índice (ONLINE) ser executada durante a noite no índice PK clusterizado. Ele falhou com um erro de TCP entre 8 e 12 horas. O índice ainda está 95% fragmentado, o tamanho ainda é relatado como 156 GB.

Existe uma explicação para que isso seja tão lento? Existe uma maneira melhor? Banco de dados de produção, tabela usada por um site, tem que estar acessível, então não pode fazer isso OFFLINE a menos que demore menos de 10 minutos - o que ninguém pode garantir.

Posso simplesmente construir todos os índices na tabela de backup, eliminar a tabela original e renomear o backup? Isso parece arriscado (pequeno risco de perder um registro criado na hora errada).


Estou tentando fazer o Azure perceber que não é mais usado. Alocado, estou bem com isso. Usado, nem tanto:

insira a descrição da imagem aqui

A tabela em questão:

insira a descrição da imagem aqui

Novamente, o problema não é o espaço reservado, mas o espaço usado.

azure-sql-database
  • 1 1 respostas
  • 38 Views

1 respostas

  • Voted
  1. Best Answer
    J.D.
    2024-01-13T23:09:20+08:002024-01-13T23:09:20+08:00

    No entanto, o tamanho da tabela ainda é relatado como 156 GB.

    Sim, isso é esperado.

    Por que?

    A forma como a alocação de espaço funciona no SQL Server é à medida que os dados crescem, o espaço é alocado fora do disco para o arquivo interno desse banco de dados dentro da instância do SQL Server, em pedaços com o tamanho definido nas propriedades do banco de dados, em Arquivo -> Crescimento automático configurações:

    Configurações de crescimento automático

    Isso reserva os dados fora do disco de forma proativa e garante que eles estejam disponíveis à medida que mais dados forem adicionados a esse banco de dados no futuro. As operações de crescimento de arquivos são operações bastante pesadas, e é por isso que o arquivo de banco de dados não cresce apenas na mesma taxa e quantidade que o próprio crescimento de dados.

    Isso também se aplica à redução de arquivos. É uma operação cara. O banco de dados foi projetado para não ser reduzido automaticamente por padrão, quando os dados são removidos. A suposição é que o espaço já reivindicado do disco será eventualmente reutilizado. Portanto, em vez de liberá-lo de volta ao disco quando os dados são removidos, ele é apenas marcado internamente para ser reutilizado em dados futuros para sobrescrevê-lo. Isso pode parecer um desperdício, mas o disco é barato e o desempenho não, que é o que se ganha implicitamente ao não crescer e diminuir continuamente sempre que os dados são alterados.

    Uma ferramenta útil é o procedimento armazenado do sistema sp_spaceused. Se você executá-lo no contexto de um banco de dados específico, sem nenhum parâmetro, ele informará o tamanho total desse banco de dados - database_sizeno primeiro conjunto de resultados e como esse espaço em disco está atualmente distribuído no arquivo do banco de dados - reservedvs datavs index_sizeem o segundo conjunto de resultados. Anteriormente, você provavelmente tinha cerca de 156 GB de espaço na datacoluna que agora seria exibida reservede significa que está pronto para ser consumido pelo crescimento futuro de dados.

    Agora, para resolver seu problema

    O SQL Server possui um comando de redução (que também pode ser executado por meio da GUI do SSMS) que liberará o espaço reservado do arquivo de banco de dados de volta ao disco (tanto quanto possível, há alguns se, e ou mas nisso). Geralmente não é recomendado porque, novamente, a redução é uma operação pesada no disco e pode afetar o desempenho simultâneo do banco de dados até que seja concluída, e porque o espaço que está sendo liberado terá que passar por uma operação de crescimento pesado novamente quando mais dados forem adicionados ao banco de dados . Mas em grandes alterações pontuais de dados, como o seu caso, provavelmente é sensato fazê-lo, se você realmente precisar.

    Nota

    As reconstruções de índice geralmente são um desperdício e uma operação inútil - causa o crescimento do arquivo, o que basicamente desfaz parte do espaço liberado pela redução. É um ciclo vicioso . Se você fizer isso na esperança de obter ganhos de desempenho, é improvável que você esteja realmente ganhando alguma coisa com as próprias reconstruções (a fragmentação do índice realmente não importa mais no hardware moderno). As reconstruções acionam ações subsequentes que podem melhorar seu desempenho, como limpar o cache do plano e atualizar estatísticas. Mas você pode executar essas coisas individualmente, de forma mais granular e eficiente, sem a necessidade de reconstruções de índice inúteis.

    • 1

relate perguntas

  • seleção única vs seleções múltiplas usando limite e deslocamento

  • Não há problema em criar centenas de bancos de dados no SQL Azure em vez de um grande e correr o risco de travar

  • Implementando uma tabela criptografada no SQL Azure

  • Servidor vinculado ao SQL Azure muito lento

  • Como posso alterar uma chave primária existente no SQL Azure?

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