# SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE

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 Derby 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.
Nota: 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 Guia do Servidor e Administração do Derby.
Tópico pai: Procedimentos do sistema nativos
Referências relacionadas
SYSCS_UTIL.SYSCS_COMPRESS_TABLE
SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS
SYSCS_UTIL.SYSCS_SET_STATISTICS_TIMING
SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY
SYSCS_UTIL.SYSCS_FREEZE_DATABASE
SYSCS_UTIL.SYSCS_UNFREEZE_DATABASE
SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE
SYSCS_UTIL.SYSCS_BACKUP_DATABASE
SYSCS_UTIL.SYSCS_EXPORT_TABLE
SYSCS_UTIL.SYSCS_EXPORT_QUERY
SYSCS_UTIL.SYSCS_IMPORT_TABLE
SYSCS_UTIL.SYSCS_IMPORT_DATA