No DB2, tenho uma tabela contendo grandes dados binários. Agora limpei toda a tabela e executei runstats, reorg, runstats, mas a quantidade de espaço em disco ocupado não muda. Oque pode estar errado aqui?
A tabela reside em seu próprio tablespace que criei da seguinte forma:
CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;
Eu apaguei/reorganizei da seguinte forma:
DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE
A tabela MY_TBL ocupava 2,5 GB antes de tudo isso e depois de deletar/reordenar usa apenas 3 MB a menos.
FWIW: Estou executando o DB2/NT v9.5.2.
Vou adivinhar que você está usando armazenamento automático. (Não que isso pudesse acontecer de outra forma... é apenas fácil que isso aconteça com o armazenamento automático.)
O problema mais provável é que seu banco de dados recuperou o espaço para si mesmo, mas não liberou o disco de volta para o sistema operacional. Isso pode ser mostrado facilmente verificando o High Water Mark para o tablespace.
faça o seguinte
db2 list tablespaces show detail
Isso mostrará cada espaço de tabela e o que ele está usando no disco.
Used pages
é quantas páginas de disco o banco de dados está usando. Comparando isso comtotal pages
(o total reivindicado no disco) e oHigh water mark (pages)
mostrará se você está "reivindicando" mais do que realmente precisa. (ou seja, poucas páginas usadas, total de páginas muito alto e uma marca d'água alta próxima ao total de páginas).Para se livrar desse espaço não utilizado e devolvê-lo ao sistema operacional, você emitiria o seguinte (em armazenamento automático):
db2 alter tablespace <tablespace name> reduce max
. exemploIsso fará com que o DB2 reduza a marca d'água alta e libere o disco não utilizado de volta ao sistema operacional. (Observe que você só pode fazer isso para espaços de tabela regulares e grandes, não para espaços de tabela temporários do sistema ou temporários do usuário).
Se você estiver usando DMS sem armazenamento automático, precisará usar um conjunto de comandos ligeiramente diferente:
exemplo
Onde trabalhamos, colocamos isso em alguns de nossos scripts de manutenção para que possamos executá-lo automaticamente depois de fazermos reorganizações para garantir a recuperação do espaço em disco. Em nosso caso, usamos o DB2 LUW 9.7 FP 4, portanto, não custa nada verificar novamente o Centro de Informações para 9.5 para garantir que você tenha acesso às informações corretas para sua versão.
A tabela
MY_TBL
contém grandes dados binários em umaBLOB
coluna. A documentação doREORG
comando diz que o DB2 evita reorganizar tais objetos porque é demorado e não melhora o clustering. No entanto, o DB2 pode ser forçado a reorganizar os dados LOB se aLONGLOBDATA
opção for especificada. O espaço não utilizado pode ser reutilizado pelo DB2, portanto, a inserção de novos dados primeiro preencherá as páginas existentes e não utilizadas antes de alocar novos.Corrida
recuperou com sucesso os 2,5 GB de espaço em disco que a tabela vazia estava usando.
Eu não sabia dessa opção e a supervisionei na primeira vez que li a documentação.