Hoje vamos falar de um parâmetro incluído no oracle 11GR2 o DEFERRED_SEGMENT_CREATION, que é a criação adiada de segmento, ou seja, só é alocado segmento na tabela quando uma linha é inserida, por default esse parâmetro vem como TRUE.
Vamos ao exemplo:
SQL> CREATE TABLE B
2 (ID NUMBER);
Tabela criada.
SQL> select segment_name from user_segments where segment_name = 'B';
não há linhas selecionadas
SQL> INSERT INTO B
2 VALUES(1);
1 linha criada.
SQL> select segment_name from user_segments where segment_name = 'B';
SEGMENT_NAME
-------------------------------------------------------------------------
B
Veja que só trouxe resultado na view user_segments após o insert.
As vantagens desse parâmetro são:
1-Economia de espaço, pois evita a alocação de segmentos em tabelas vazias.
2-Na criação da tabela não ocorrerá erros referentes a falta de privilégios ou falta de espaço em tablespace.
3-As execuções de instruções DDL ficam mais rápidas, pois não é criado segmento em disco.
Para alterar o parâmetro a nível de instância utilize o comando abaixo:
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=[TRUE | FALSE];
Também pode ser alterado a nível de sessão:
ALTER SESSION SET DEFERRED_SEGMENT_CREATION =[TRUE | FALSE];
E a nível de tabela:
CREATE TABLE T1 (id number) SEGMENT CREATION [IMMEDIATE | DEFERRED];
Alguns pontos importantes sobre essa nova funcionalidade:
1- Só está disponível para a versão Enterprise Edition, então caso seja efetuado um export de um banco oracle 11GR2 Enterprise Edition para um banco oracle 11GR2 Standart Edition ou release/versão inferior, deve se usar o parâmetro compatibilidade (version) no expdp, pois se existir alguma tabela sem segmento, ocorrerá o erro ORA-00439: feature not enabled: Deferred Segment Creation.
SQL> select segment_name from user_segments where segment_name = 'B';
não há linhas selecionadas
SQL> INSERT INTO B
2 VALUES(1);
1 linha criada.
SQL> select segment_name from user_segments where segment_name = 'B';
SEGMENT_NAME
-------------------------------------------------------------------------
B
Veja que só trouxe resultado na view user_segments após o insert.
As vantagens desse parâmetro são:
1-Economia de espaço, pois evita a alocação de segmentos em tabelas vazias.
2-Na criação da tabela não ocorrerá erros referentes a falta de privilégios ou falta de espaço em tablespace.
3-As execuções de instruções DDL ficam mais rápidas, pois não é criado segmento em disco.
Para alterar o parâmetro a nível de instância utilize o comando abaixo:
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=[TRUE | FALSE];
Também pode ser alterado a nível de sessão:
ALTER SESSION SET DEFERRED_SEGMENT_CREATION =[TRUE | FALSE];
E a nível de tabela:
CREATE TABLE T1 (id number) SEGMENT CREATION [IMMEDIATE | DEFERRED];
Alguns pontos importantes sobre essa nova funcionalidade:
1- Só está disponível para a versão Enterprise Edition, então caso seja efetuado um export de um banco oracle 11GR2 Enterprise Edition para um banco oracle 11GR2 Standart Edition ou release/versão inferior, deve se usar o parâmetro compatibilidade (version) no expdp, pois se existir alguma tabela sem segmento, ocorrerá o erro ORA-00439: feature not enabled: Deferred Segment Creation.
2- O utilitário EXP não reconhece tabelas sem segmentos, ou seja, se você utilizar o exp no banco 11GR2 e existir alguma tabela sem segmento, ela não será exportada.Então utilize o EXPDP ou então desabilite o parâmentro e force a criação de segmentos com o comando ALTER TABLE <<table_name>> ALLOCATE EXTENT. Esse problema foi corrigido no release 11.2.0.2.
3- No 11.2.0.2 o parâmentro também é válido para tabelas particionadas e foi adicionado 2 procedimentos ao pacote DBMS_SPACE_ADMIN para o gerenciamento de segmentos:
DBMS_SPACE_ADMIN.materialize_deferred_segments -> Força a criação de segmentos para tabela em que a criação dos segmentos foi adiada. Exemplo:
BEGIN
DBMS_SPACE_ADMIN.materialize_deferred_segments (
schema_name => 'TESTE'
table_name => 'TAB1',
nome_da_partição => NULL);
END;
/
DBMS_SPACE_ADMIN.drop_empty_segments -> Elimina os segmentos de tabelas sem linhas.
Exemplo:
BEGIN
DBMS_SPACE_ADMIN.drop_empty_segments (
schema_name => 'TESTE'
table_name => 'TAB1',
nome_da_partição => NULL);
END;
/
Até o próximo post.
Isabele Barros
Nenhum comentário:
Postar um comentário