Páginas

quarta-feira, 25 de julho de 2012

DEFERRED_SEGMENT_CREATION

Olá pessoal,

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. 

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