No Oracle, LOGGING
e NOLOGGING
controlam como as alterações no banco são registradas nos redo logs, que são necessarias para recuperar dados em caso de falhas.
O modo LOGGING
registra todas as alterações, garantindo que os dados possam ser restaurados. Já o modo NOLOGGING
melhora a performance ao reduzir ou até eliminar a geração de redo logs em operações específicas, como cargas diretas de dados. Porém, dados inseridos com NOLOGGING
não são protegidos por redo logs e não podem ser recuperadas em caso de falhas.
Se for necessário garantir que todas as operações gerem redo logs, mesmo que estejam configuradas como NOLOGGING
, o recurso FORCE LOGGING
pode ser habilitado. No nível do banco, ele força o registro no redo log, oferecendo maior segurança para ambientes críticos. Saiba mais sobre o FORCE LOGGING
neste post do blog: Force Logging Oracle: como ativar e desativar.

Diferenças práticas entre logging e nologging
Por padrão, as tabelas seguem o comportamento da tablespace onde são criadas. Se nada for especificado, o modo LOGGING
é ativado.

No modo NOLOGGING
, a geração de redo diminui ou desaparece em operações específicas, como cargas diretas (direct path insert
).

- Inserções comuns (
INSERT
, semAPPEND
), atualizações (UPDATE
), exclusões (DELETE
) e comandos comoMERGE
continuam gerando redo, mesmo em tabelas configuradas comNOLOGGING
. - Apenas operações de carga direta, como
INSERT /*+ APPEND */
ou/*+ APPEND VALUES */
,, evitam a geração de redo, gravam os dados diretamente nos blocos.
O uso de NOLOGGING
pode aumentar muito a performance, mas traz o risco de perda de dados, já que eles não serão recuperáveis por um RECOVER
.. Para dados críticos, use LOGGING
ou faça um backup imediatamente após a carga.
Preparação do ambiente
SQL> CREATE TABLESPACE TBS_TESTE_HR SIZE 1G AUTOEXTEND ON NEXT 250M;
Tablespace created.
SQL> CREATE TABLE HR.EMP AS
2 SELECT ROWNUM emp_id,
3 MOD(ROWNUM, 1000) dept_id,
4 'Employee ' || ROWNUM emp_name,
5 'Descrição para linha ' || ROWNUM description
6 FROM dual CONNECT BY ROWNUM <= 2000000;
Table created.
SQL> INSERT INTO HR.EMP
2 SELECT *
3 FROM HR.EMP;
2000000 rows created.
SQL> COMMIT;
Commit complete.
SQL> SELECT COUNT(1) TOTAL_LINHAS FROM HR.EMP;
TOTAL_LINHAS
------------
4000000
SQL> -- Criar tabela destino para os testes
SQL> CREATE TABLE HR.PEDIDOS
2 TABLESPACE TBS_TESTE_HR
3 AS
4 SELECT * FROM HR.EMP WHERE 1=0;
Table created.
SQL> SELECT owner, TABLE_NAME, LOGGING from dba_tables where TABLE_NAME = 'PEDIDOS' and owner = 'HR';
OWNER TABLE_NAME LOGGING
------- -------------------- ----------
HR PEDIDOS YES
SQL>
Como foram criadas as tabelas para os testes?
Tabela HR.EMP
- Criada com 4 milhões de registros simulados.
- Serve como base de dados para os testes de inserção.
Tabela HR.PEDIDOS
- Criada sem dados, apenas com a estrutura da tabela
HR.EMP
. - Usada como destino das inserções nos testes.
O que é APPEND e como ele funciona com NOLOGGING?
O APPEND
é uma hint que transforma o comando INSERT
em uma carga direta de dados (direct path insert). Nesse tipo de operação, os dados são gravados diretamente nos blocos da tabela no disco.
Quando usado junto com o modo NOLOGGING
, o APPEND
não gera redo logs, o que otimiza ainda mais a operação. Essa combinação é especialmente útil para cargas de dados massivas, onde a prioridade é a performance.
O APPEND
é ideal para inserções baseadas em consultas (INSERT INTO ... SELECT
). Já o APPEND VALUES
expande essa funcionalidade para operações onde se insere dados utilizando a clausula VALUES
, (INSERT INTO ... VALUES
). Ambos seguem a mesma lógica: gravar os dados diretamente nos blocos da tabela.
- APPEND grava os dados diretamente no disco.
- Com NOLOGGING, os redo logs não são gerados, economizando recursos e acelerando a operação.
- Porém, sem redo logs, não há recuperação dos dados em caso de falhas.
Como os testes são realizados?
- Antes de cada teste, verificamos o valor atual de redo logs com a visão
V$SYSSTAT
. - Fazemos as inserções na tabela
HR.PEDIDOS
em diferentes cenários (LOGGING
eNOLOGGING
, com ou semAPPEND
). - Após cada teste, verificamos novamente o valor dos redo logs para calcular a quantidade gerada.
- Ativamos o comando
SET TIMING ON
para medir o tempo de execução de cada operação.
Com isso, conseguimos comparar como cada cenário impacta na performance e na geração de redo logs.
Teste 1: LOGGING sem APPEND
SQL> ALTER TABLE HR.PEDIDOS NOLOGGING;
Table altered.
SQL> SELECT owner, TABLE_NAME, LOGGING from dba_tables where TABLE_NAME = 'PEDIDOS' and owner = 'HR';
OWNER TABLE_NAME LOGGING
------- -------------------- ----------
HR PEDIDOS YES
SQL> SELECT value AS redo_antes
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_ANTES
-----------
1510561132
SQL> SET TIMING ON
SQL> INSERT INTO HR.PEDIDOS
2 SELECT emp_id, dept_id, emp_name,
3 'LOGGING sem APPEND' description
4 FROM HR.EMP;
4000000 rows created.
Elapsed: 00:00:08.22
SQL> SET TIMING OFF
SQL> SELECT value AS redo_depois
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_DEPOIS
-----------
1748028892
SQL>
LOGGING sem APPEND: (1748028892 - 1510561132)
= 237.467.760 bytes Redo
Teste 2: LOGGING com APPEND
SQL> ALTER TABLE HR.PEDIDOS NOLOGGING;
Table altered.
SQL> SELECT owner, TABLE_NAME, LOGGING from dba_tables where TABLE_NAME = 'PEDIDOS' and owner = 'HR';
OWNER TABLE_NAME LOGGING
------- -------------------- ----------
HR PEDIDOS YES
SQL> SELECT value redo_antes
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_ANTES
-----------
1748028892
SQL> SET TIMING ON;
SQL> INSERT /*+ APPEND */ INTO HR.PEDIDOS
2 SELECT emp_id, dept_id, emp_name,
3 'LOGGING com APPEND' description
4 FROM HR.EMP;
4000000 rows created.
Elapsed: 00:00:05.50
SQL> SET TIMING OFF
SQL> SELECT value redo_depois
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_DEPOIS
-----------
1976176832
SQL>
LOGGING com APPEND: (1976176832 - 1748028892)
= 228.147.940 bytes Redo
Teste 3: NOLOGGING sem APPEND
SQL> ALTER TABLE HR.PEDIDOS NOLOGGING;
Table altered.
SQL> SELECT owner, TABLE_NAME, LOGGING from dba_tables where TABLE_NAME = 'PEDIDOS' and owner = 'HR';
OWNER TABLE_NAME LOGGING
------- -------------------- ----------
HR PEDIDOS NO
SQL> SELECT value redo_antes
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_ANTES
-----------
1976176832
SQL> SET TIMING ON;
SQL> INSERT INTO HR.PEDIDOS
2 SELECT emp_id, dept_id, emp_name,
3 'NOLOGGING sem APPEND' description
4 FROM HR.EMP;
4000000 rows created.
Elapsed: 00:00:07.14
SQL> SET TIMING OFF
SQL> SELECT value redo_depois
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_DEPOIS
-----------
2222224840
SQL>
NOLOGGING sem APPEND: (2222224840 - 1976217132)
= 246.007.708 bytes Redo
Teste 4: NOLOGGING com APPEND
SQL> ALTER TABLE HR.PEDIDOS NOLOGGING;
Table altered.
SQL> SELECT owner, TABLE_NAME, LOGGING from dba_tables where TABLE_NAME = 'PEDIDOS' and owner = 'HR';
OWNER TABLE_NAME LOGGING
------- -------------------- ----------
HR PEDIDOS NO
SQL> SELECT value redo_antes
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_ANTES
-----------
2222224840
SQL> SET TIMING ON
SQL> INSERT /*+ APPEND */ INTO HR.PEDIDOS
2 SELECT emp_id, dept_id, emp_name,
3 'NOLOGGING com APPEND' description
4 FROM HR.EMP;
4,000,000 rows created.
Elapsed: 00:00:03.94
SQL> SET TIMING OFF
SQL> SELECT value redo_depois
2 FROM v$sysstat
3 WHERE name = 'redo size';
REDO_DEPOIS
-----------
2222367760
SQL>
NOLOGGING com APPEND: (2222367760 - 2222224840)
= 142.920 bytes Redo
Tabela comparativa
Cenário | Redo Gerado (Bytes) | Uso de Redo (%) | Tempo (s) | Uso de Tempo (%) |
---|---|---|---|---|
LOGGING sem APPEND | 237.467.760 | 100% | 8.22 | 100% |
LOGGING com APPEND | 228.147.940 | 96% | 5.50 | 67% |
NOLOGGING sem APPEND | 246.007.708 | 104% | 7.14 | 87% |
NOLOGGING com APPEND | 142.920 | 0.06% | 3.94 | 48% |
Dados inseridos com NOLOGGING APPEND
não são protegidos por redo logs.
Se ocorrer uma falha ou houver necessidade de recuperação (recover), esses dados não poderão ser restaurados.
Para cargas de dados críticas, a recomendação é utilizar LOGGING
ou realizar um backup completo imediatamente após a carga.
e … zas
Remover Objetos Criados
SQL> DROP TABLE HR.PEDIDOS PURGE;
Table dropped.
SQL> DROP TABLE HR.EMP PURGE;
Table dropped.
SQL> DROP TABLESPACE TBS_TESTE_HR INCLUDING CONTENTS AND DATAFILES;
Tablespace dropped.
SQL>
🐤🐣#20250131 #DBASobrinho #GuinaNãoTinhaDó #BóBó #CaceteDeAgulha #OracleACE 🐤🐣