Eu me deparei com isso recentemente. Ao definir uma tabela no DB2 LUW (pelo menos 9,5 ou superior), você pode defini-la como NOT LOGGED INITIALLY
.
Exemplo do livro que li:
CREATE TABLE products (
productID INT,
product_Name VARCHAR(30)
)
NOT LOGGED INITIALLY;
A documentação que li afirma que a tabela não é registrada durante a execução de INSERT
, UPDATE
, DELETE
, CREATE INDEX
, ALTER TABLE
ou DROP INDEX
até que uma COMMIT
instrução seja executada. Tudo antes do COMMIT
não é registrado. Tudo depois do COMMIT
é.
E, aparentemente, desde que você defina a tabela como NOT LOGGED INITIALLY
, a qualquer momento você pode emitir um ALTER TABLE <table-name> ACTIVATE NOT LOGGED INITIALLY
para colocar a tabela de volta em um estado sem registro até que um COMMIT
seja emitido novamente.
Eles deram um exemplo que eu posso ver onde isso pode ser útil. O livro que li afirmou que você poderia emitir o seguinte
ALTER TABLE <table-name> ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;
e isso aparentemente excluirá todos os dados da tabela sem registrá-los. Posso entender isso como desejável em um ambiente de teste em que você deseja limpar os dados e testar novamente sem a sobrecarga de desempenho de registrar a exclusão para reversão.
Mas além deste caso, estou intrigado. Existe algum motivo para você não querer fazer logon em uma tabela fora de um ambiente de teste? Que outras utilizações existem para este tipo de mesa?
O exemplo clássico do mundo real é onde a tabela que estou criando é uma cópia de uma fonte externa estática. Se o banco de dados falhar durante o carregamento inicial, será mais rápido apenas descartar a tabela parcialmente carregada e iniciar minha operação de importação desde o início, do que sofrer a sobrecarga de registrar totalmente a transação.
Por exemplo, estou carregando meu ambiente de relatório com uma lista de clientes do arquivo de backup do meu ambiente transacional.
Também do manual :
Isso também faz sentido em um ambiente de produção.
Não registrado inicialmente é útil, digamos, quando você acabou de criar uma tabela e precisa preenchê-la com uma grande quantidade de dados. Você não precisa se preocupar em recuperar os dados, pois já os possui em algum lugar, portanto, nenhuma população de dados precisa ser registrada. Isso pode acelerar muito o tempo de preenchimento de dados se você não precisar registrá-lo.
Como a parte de produção desta pergunta não foi respondida, tenho um exemplo de onde seria útil. Estou fazendo backup de uma tabela de produção para meu espaço de usuário. Esta tabela contém muitos dados (~ 850 GB compactados) e o backup por meios normais não é possível porque o arquivo de log gerado (mais de 18 GB antes de eu matar a inserção) causa falha em várias funções downstream. O NOT LOGGED INITIALLY é minha única opção para evitar que isso aconteça.