Nieuw in Oracle 11g Release 2: delayed segment creation
Maak effectief gebruik van uw schijfruimte
Veel applicaties hebben een flinke verzameling tabellen. Een groot deel daarvan gebruikt u helemaal niet. Vooral bij standaardpakketten is dat het geval. Toch staan de tabellen in de database, krijgen ze ruimte toegewezen en worden ze meegenomen in de back-up. Dat geldt ook voor de bijbehorende indexen. Bij het automatisch toewijzen van tabelruimte gaat het om slechts 64K per segment. Dit kan echter fors oplopen bij honderden tabellen en indexen. Oracle 11g Release 2 biedt een oplossing.
Met Oracle 11g Release 2 is het mogelijk om ruimte voor een tabel te alloceren op het moment dat er een rij aan wordt toegevoegd. Pas dan wijst de software een extent toe. Dit wordt geregeld door de parameter DEFERRED_SEGMENT_CREATION, die standaard op ‘true’ staat. De eerste insert zal hierdoor wel iets trager zijn. Maar het grote voordeel is dat u de beschikbare schijfruimte veel beter benut. U hoeft immers geen ruimte te reserveren voor tabellen of indexen waar u geen gebruik van maakt. Ter illustratie de volgende simpele demo:
SQL> show parameter deferred
NAME TYPE VALUE
--------------------------------------------------------------
deferred_segment_creation boolean TRUE
SQL> create table scott.test_table (a number, text char(200));
Table created.
SQL> create index test_table_ix on scott.test_table(a);
Index created.
SQL> select owner,
segment_name,
segment_type ,
blocks
from dba_extents
where segment_name like 'TEST_TABLE%';
no rows selected
SQL> insert into scott.test_table values (1,'mijn tekst');
1 row created.
SQL> select owner,
segment_name,
segment_type,
blocks
from dba_extents
where segment_name like 'TEST_TABLE%';
SEGMENT_NAME SEGMENT_TYPE BLOCKS
----------------------------------------------------------
TEST_TABLE_IX INDEX 8
TEST_TABLE TABLE 8
Wilt u toch dat de Oracle software direct ruimte toewijst bij het creëren van een tabel? Dan zet u de parameter gewoon op ‘false’. Dit kan zelfs op sessieniveau. Delayed segment creation is pas actief vanaf Oracle 11g Release 2. Dit betekent dat alle bestaande segmenten behouden blijven tijdens een upgrade, ook al zijn ze leeg.
Meer ruimte besparen met unusable index segment deletion
Een functie waarmee u eveneens ruimte vrijhoudt, is unusable index segment deletion. Stel, u markeert een index als ‘unusable’, bijvoorbeeld bij het laden van grote hoeveelheden data. De index wordt in dat geval niet bijgewerkt. Na het laden kunt u een alter index rebuild uitvoeren om de index opnieuw op te bouwen. De originele indexstructuur is dan echter niet meer gesynchroniseerd met de onderliggende tabel. Deze kan hierdoor niet gebruikt worden tijdens de rebuild. Oracle 11g release 2 geeft de opslagstructuur van de index vrij op het moment dat u deze als ‘unusable’ markeert. De index is hiermee een structuur zonder bijbehorend segment. In een gepartitionieerde omgeving kunt u veel ruimte besparen door historische partities als ‘unusable’ te markeren. De data zijn er nog, maar de index als toegangsstructuur is vaak niet meer nodig.
De volgende demo laat zien hoe het werkt:
SQL> create index test on scott.emp(ename);
Index created.
SQL> select segment_name, blocks
from dba_segments
where segment_name='TEST';
SEGMENT_NAME BLOCKS
-------------------------------------
TEST 8
SQL> alter index system.test unusable;
Index altered.
SQL> select segment_name,
Blocks
from dba_segments
where segment_name='TEST';
no rows selected
SQL> select index_name,
status
from dba_indexes
where index_name='TEST';
INDEX_NAME STATUS
-----------------------------------
TEST UNUSABLE
SQL> alter index test rebuild;
index rebuild
SQL> select segment_name, blocks
from dba_segments
where segment_name='TEST';
SEGMENT_NAME BLOCKS
---------------------------------------
TEST 8
Zowel delayed segment creation als unusable index segment deletion stelt u in staat om veel effectiever met uw beschikbare schijfruimte om te springen.

