Deferred Segment Creation
E' un parametro introdotto dalla versione oracle 11gr2.
Di default è valorizzato a true e consiste nel creare la tabella solo quando viene effettuata la prima insert.
SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
------------------------- ------- --------------------------------
deferred_segment_creation boolean TRUE
Creiamo la tabella vuota TEST_DEF ed eseguiamo le seguenti query:
SQL> select segment_name from USER_SEGMENTS where segment_name= 'TEST_DEF' ;
0 row selected
SQl> select segment_created from USER_TABLES where table_name= 'TEST_DEF' ;
SEGMENT_CREATED
-----------------------------------
NO
Nel momento che effettuo una insert, seguita da commit o rollback, viene occupato il segment da associare alla tabella.
SQL> insert into TEST_DEF values (101);
Di default è valorizzato a true e consiste nel creare la tabella solo quando viene effettuata la prima insert.
SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
------------------------- ------- --------------------------------
deferred_segment_creation boolean TRUE
Creiamo la tabella vuota TEST_DEF ed eseguiamo le seguenti query:
SQL> select segment_name from USER_SEGMENTS where segment_name= 'TEST_DEF' ;
0 row selected
SQl> select segment_created from USER_TABLES where table_name= 'TEST_DEF' ;
SEGMENT_CREATED
-----------------------------------
NO
Nel momento che effettuo una insert, seguita da commit o rollback, viene occupato il segment da associare alla tabella.
SQL> insert into TEST_DEF values (101);
SQL> select segment_name from USER_SEGMENTS where segment_name= 'TEST_DEF' ;
SEGMENT_NAME
-------------------------
TEST_DEF
SEGMENT_NAME
-------------------------
TEST_DEF
SQl> select segment_created from USER_TABLES where table_name= 'TEST_DEF' ;
SEGMENT_CREATED
---------------------------
YES
Vantaggio: se un applicazione effettua molte create table ma non li popola, non occupo inutilmente dei segments.
E' possibile creare direttamente il segment in fase di creazione della tabella usando la seguente clausola:
SQL> CREATE TABLE test_def2 (x number) SEGMENT CREATION IMMEDIATE;
SQL> select segment_name from user_segments where segment_name= 'TEST_DEF2' ;
SEGMENT_NAME
-------------------------
TEST_DEF2
SQl> select segment_created from USER_TABLES where table_name= 'TEST_DEF2' ;
SEGMENT_CREATED
---------------------------
YES
Invece di usare la clausola precedente è possibile disabilitarlo a livelllo di sessione o di sistema
SQL> alter session set DEFERRED_SEGMENT_CREATION=false;
SQL> alter system set DEFERRED_SEGMENT_CREATION=false;
Ci sono comunque dei limiti nell'utilizzo di questo parametro.
SEGMENT_CREATED
---------------------------
YES
Vantaggio: se un applicazione effettua molte create table ma non li popola, non occupo inutilmente dei segments.
E' possibile creare direttamente il segment in fase di creazione della tabella usando la seguente clausola:
SQL> CREATE TABLE test_def2 (x number) SEGMENT CREATION IMMEDIATE;
SQL> select segment_name from user_segments where segment_name= 'TEST_DEF2' ;
SEGMENT_NAME
-------------------------
TEST_DEF2
SQl> select segment_created from USER_TABLES where table_name= 'TEST_DEF2' ;
SEGMENT_CREATED
---------------------------
YES
Invece di usare la clausola precedente è possibile disabilitarlo a livelllo di sessione o di sistema
SQL> alter session set DEFERRED_SEGMENT_CREATION=false;
SQL> alter system set DEFERRED_SEGMENT_CREATION=false;
Ci sono comunque dei limiti nell'utilizzo di questo parametro.
Ad esempio non funziona se si creano tabelle e indici partizionati.
Per altre restrizioni guardare la documentazione ufficiale.
Per altre restrizioni guardare la documentazione ufficiale.