O procedimento do sistema
SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE
é utilizado para recuperar o espaço alocado, mas não utilizado, de uma
tabela e seus índices.
Normalmente, existe espaço alocado mas não utilizado quando uma grande
quantidade de dados é excluída da tabela, e não ocorrem inserções subseqüentes
para utilizar o espaço criado pelas exclusões.
Por padrão, o
não retorna para o sistema operacional o espaço não utilizado.
Por exemplo, uma vez que uma página tenha sido alocada para uma tabela ou um
índice, esta não é devolvida automaticamente para o sistema operacional até
que a tabela ou o índice tenha sido removido.
O procedimento do sistema
SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE
permite devolver para o sistema operacional o espaço não utilizado.
Este procedimento do sistema pode ser utilizado para ocasionar três níveis de
compressão in loco de uma tabela SQL:
PURGE_ROWS, DEFRAGMENT_ROWS e
TRUNCATE_END.
Diferentemente de SYSCS_UTIL.SYSCS_COMPRESS_TABLE(),
todo o trabalho é feito in loco na tabela ou índice existente.
Sintaxe
SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(
IN SCHEMANAME VARCHAR(128),
IN TABLENAME VARCHAR(128),
IN PURGE_ROWS SMALLINT,
IN DEFRAGMENT_ROWS SMALLINT,
IN TRUNCATE_END SMALLINT )
- SCHEMANAME
- Um argumento de entrada do tipo VARCHAR(128) que especifica o esquema da
tabela. Passar um argumento nulo resulta em erro.
- TABLENAME
- Um argumento de entrada do tipo VARCHAR(128) que especifica o nome da
tabela.
A cadeia de caracteres deve corresponder exatamente às letras maiúsculas e
minúsculas do nome da tabela: um argumento igual a "Fred" é passado para o SQL
como o identificador delimitado 'Fred'.
Passar um argumento nulo resulta em erro.
- PURGE_ROWS
- Se PURGE_ROWS for definido com um valor diferente de zero, então será feita
uma única passagem através da tabela para remover as linhas com a exclusão
efetivada.
Este espaço se torna disponível para as próximas linhas inseridas, mas permanece
alocado para a tabela.
Como esta opção varre todas as páginas da tabela, seu desempenho é linearmente
proporcional ao tamanho da tabela.
- DEFRAGMENT_ROWS
- Se DEFRAGMENT_ROWS for definido com um valor diferente de zero, então será
feita uma única passagem de desfragmentação para mover as linhas existentes no
final da tabela em direção ao início da tabela.
O objetivo da desfragmentação é esvaziar um conjunto de páginas no final da
tabela, que poderão depois ser devolvidas ao sistema operacional pela opção
TRUNCATE_END.
Recomenda-se somente utilizar a opção DEFRAGMENT_ROWS quando a opção
TRUNCATE_END também é utilizada.
A opção DEFRAGMENT_ROWS varre toda a tabela, e precisa atualizar as entradas
dos índices de todas as linhas da tabela base movidas, portanto o tempo de
execução é linearmente proporcional ao tamanho da tabela.
- TRUNCATE_END
- Se TRUNCATE_END for definido com um valor diferente de zero, então todas as
páginas contíguas no final da tabela serão devolvidas para o sistema operacional.
A execução das opções PURGE_ROWS e/ou DEFRAGMENT_ROWS pode aumentar o número de
páginas afetadas.
Por si só, esta opção não realiza uma varredura na tabela.
Exemplo SQL
Para comprimir a tabela chamada CLIENTE no esquema chamado US,
utilizando todas as opções de compressão disponíveis:
CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('US', 'CLIENTE', 1, 1, 1);
Para devolver o espaço livre no final da mesma tabela, pode se feita a
seguinte chamada, que é muito mais rápida do que executar todas as opções,
mas provavelmente devolve muito menos espaço:
CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE('US', 'CLIENTE', 0, 0, 1);
Exemplo Java
Para comprimir a tabela chamada CLIENTE no esquema chamado US,
utilizando todas as opções de compressão disponíveis:
CallableStatement cs = conn.prepareCall
("CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE(?, ?, ?, ?, ?)");
cs.setString(1, "US");
cs.setString(2, "CLIENTE");
cs.setShort(3, (short) 1);
cs.setShort(4, (short) 1);
cs.setShort(5, (short) 1);
cs.execute();
Para devolver o espaço livre no final da mesma tabela, pode se feita a
seguinte chamada, que é muito mais rápida do que executar todas as opções,
mas provavelmente devolve muito menos espaço:
CallableStatement cs = conn.prepareCall
("CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE(?, ?, ?, ?, ?)");
cs.setString(1, "US");
cs.setString(2, "CLIENTE");
cs.setShort(3, (short) 0);
cs.setShort(4, (short) 0);
cs.setShort(5, (short) 1);
cs.execute();
Recomenda-se que o procedimento SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE
seja executado no modo de auto-efetivação.
Este procedimento obtém um bloqueio exclusivo na tabela sendo comprimida.
Todos os planos de instrução dependentes da tabela ou de seus índices são
invalidados.
Para obter informações sobre como identificar espaço não utilizado deve ser
consultado o .