Criação adiada de segmentos
July 18, 2012

A feature já diz tudo!

A Criação Adiada de Segmentos (Deferred Segment Creation) realmente faz o que o nome diz, somente é criado um segmento quando uma linha é inserida e não quando criamos o objeto, funcionalidade essa habilitada por DEFAULT a partir do Oracle 11G R2 através do parâmetro de inicialização DEFERRED_SEGMENT_CREATION.

SQL> show parameter deferred

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE

Veja aqui que quando crio a tabela T1, nenhum segmento é criado com ela:

SQL> create table  T (id number);

Table created.

SQL> select * from user_segments;

no rows selected

Somente então quando insiro a primeira linha na tabela que o segmento é criado:

SQL> insert into T values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> select segment_name from user_segments;

SEGMENT_NAME
--------------------------------------------------------------------------------
T

SQL> select table_name,segment_created from user_tables;

TABLE_NAME                     SEG
------------------------------ ---
T                             YES

Ok, Você deve estar se perguntando agora … quais as reais vantagens dessa feature? Vamos lá …

Economia de espaço. Lembra aquelas tabelas que são criadas mais nunca populadas? Pois então, uma grande quantidade de dados pode ser salvada para as centenas ou milhares de tabelas criadas pela aplicação que nunca foram usadas.

Quando se vai instalar uma aplicação, o tempo da criação das DDL pode ser reduzidas drasticamente apenas evitando a criação do segmento em disco. Quando estou preste a fazer a carga inicial do GoldenGate em que a estrutura das tabelas de destinos devem estar iguais com as tabelas da origem, sempre antes de realizar a importação da estrutura das tabelas verifico o parâmetro DEFERRED_SEGMENT_CREATION, o tempo gasto para criar os segmentos é muito grande é um tempo desnecessário, já que ele será criado logo após o primeiro INSERT.

Como esse parâmetro é dinâmico, pode ser alterado a qualquer:

SQL> show parameter def
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE

SQL> alter system set deferred_segment_creation=FALSE;

System altered.

SQL> show parameter def

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     FALSE

SQL> create table T1 (id number);

Table created.

SQL> select segment_name from user_segments;

SEGMENT_NAME
--------------------------------------------------------------------------------
T1

E também é possível a alteração desse comportamento a nível de sessão, apenas com um alter session:

SQL> alter session set deferred_segment_creation=true;

Caso você não queira alterar a nível de sistema ou de sessão, a Oracle pensou em você. É capaz também de alterar esse comportamento no momento da criação da tabela:

SQL> select * from user_segments;

no rows selected

SQL> CREATE TABLE TABELA_SEGMENTO1 (id number) SEGMENT CREATION IMMEDIATE;  

Table created.

SQL> select segment_name from user_segments;

SEGMENT_NAME
--------------------------------------------------------------------------------
TABELA_SEGMENTO1

SQL>CREATE TABLE TABELA_SEGMENTO2 (C1 number, C2 number) SEGMENT CREATION DEFERRED;

Table created.

SQL> select segment_name from user_segments;

SEGMENT_NAME
--------------------------------------------------------------------------------
TABELA_SEGMENTO1

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*