Eu estava vagando qual é o propósito prático de usar a cláusula NOLOGGING em tabelas e índices.
Pelo que sei da documentação do Oracle, podemos impedir que o banco de dados gere logs de redo somente ao INSERIR no modo de caminho direto. Não há possibilidade de evitar a geração de redo log ao UPDATING ou DELETING.
Então, geralmente escrevemos
INSERT /*+ APPEND NOLOGGING */ INTO TABLE ... ;
commit;
para evitar a geração de redo log.
Eu totalmente não entendo qual é a vantagem prática de usar a cláusula NOLOGGING na criação de TABLE ou INDEX nem usar a cláusula NOLOGGING na criação de TABLESPACES para definir o padrão nos objetos que serão criados nesse tablespace.
Alguém pode descrever um cenário prático onde definir esta cláusula em objetos de banco de dados pode dar vantagens?
Não existe tal dica como
NOLOGGING
.Claro,
UPDATE
eDELETE
as operações não podem tirar proveito deNOLOGGING
, mas existem outras operações que podem:logging_clause
O mecanismo NOLOGGING, como você apontou, é evitar a geração de informações de redo logging, e isso pode tornar o carregamento em massa mais rápido.
Eu o uso normalmente para grandes trabalhos de carregamento. Por exemplo, carregar terabytes de imagens de satélite: significa que vou gravar TB de bits no banco de dados propriamente dito (os arquivos de dados), mas também gravarei terabytes nos logs de redo. Isso significa E/S adicionais nos logs, bem como muito espaço em disco para os logs de arquivo.
Ao desabilitar o log durante essa carga, evito essas E/Ss e espaço extras.
Claro, isso significa que, se eu tiver uma perda total de mídia (= uma unidade de disco falha irremediavelmente), não consigo recuperar: posso recuperar a mídia de um backup, mas não consigo avançar a falha carregar. Tudo bem: é mais rápido reiniciar o carregamento a partir do último ponto de confirmação do que fazer o banco de dados percorrer TB e TB de logs.
Então, essencialmente, nologging faz sentido se:
CREATE TABLE AS SELECT
ouINSERT SELECT