Mit dem Release 11.2 hat Oracle eine Erweiterung des CREATE TABLE Statements eingeführt. Es handelt sich um die verzögerte Segmenterzeugung oder DEFERRED SEGMENT CREATION.
Was macht dieses neue Feature? Wird eine neue Tabelle erzeugt, werden nur die Metainformationen angelegt, aber noch kein Segment im Tablespace erzeugt. Das bedeutet, dass eine neue Tabelle erstmal keinen Platz "verschwendet". Solange die Tabelle leer ist, ändert sich auch daran nichts. Das Segment im Tablespace wird erst angelegt, wenn die ersten Daten in die Tabelle geschrieben werden. Das gleiche gilt auch für zugehörige Indizes und Lobsegmente.
Was bedeutet das für die Praxis? Es gibt viele große Softwareinstallationen die tausende von Tabellen anlegen, jedoch nur einen Teil davon in der jeweiligen Ausbaustufe benötigen. Bis jetzt wurde für jede Tabelle sofort das zugehörige Segment angelegt. Dabei kann unter Umständen viel Platz verschwendet werden, der so nicht benötigt wird.
Es gibt natürlich auch einen Nachteil den man bedenken sollte. Der erste Insert in eine leere Tabelle dauert länger, weil das Segment angelegt werden muss.
Doch nun zur Praxis. Welche Voraussetzungen sind nötig um die verzögerte Speicherplatzbelegung zu nutzen?
DEFERRED_SEGMENT_CREATION=TRUE
Die Syntax der CREATE TABLE Anweisung hat sich um die SEGMENT CREATION Klausel erweitert.
CREATE TABLE tablename (col1 DATATYPE,...)
...
SEGMENT CREATION DEFERRED | IMMEDIATE;
Das Verhalten der SEGMENT CREATION Klausel ist abhängig von dem Parameter DEFFERED_SEGMENT_CREATION. Steht der Parameter auf TRUE (default), dann werden die Segmente einer neuen Tabelle automatisch verzögert angelegt. Steht der Parameter auf FALSE, werden die Segmente sofort angelegt. Dieses Verhalten kann durch Angabe der Klausel jedoch überschrieben werden.
Nun einige Beispiele zur Verdeutlichung des Verhaltens:
-- DEFERRED_SEGMENT_CREATION=true
create table test_def1
(id number, constraint test_def1_pk primary key(id));
Table created.
select object_name, object_type
from user_objects
where object_name like 'TEST_DEF%';
OBJECT_NAME OBJECT_TYPE
---------------------- ------------------------------
TEST_DEF1 TABLE
TEST_DEF1_PK INDEX
select segment_name, segment_type, bytes/1024/1024 MB
from user_segments
where segment_name like 'TEST_DEF%';
no rows selected
In diesem Beispiel wird deutlich das die Tabelle existiert, aber bis jetzt noch kein Speicherplatz allokiert wurde.
Im nächsten Beispiel überschreiben wir das Defaultverhalten mit der SEGMENT DEFERRED Klausel:
create table test_def2
(id number, constraint test_def2_pk primary key(id))
SEGMENT CREATION IMMEDIATE;
Table created.
select object_name, object_type
from user_objects
where object_name like 'TEST_DEF%';
OBJECT_NAME OBJECT_TYPE
---------------------- ------------------------------
TEST_DEF1 TABLE
TEST_DEF1_PK INDEX
TEST_DEF2 TABLE
TEST_DEF2_PK INDEX
select segment_name, segment_type, bytes/1024/1024 MB
from user_segments
where segment_name like 'TEST_DEF%';
SEGMENT_NAME SEGMENT_TYPE MB
---------------------- ------------------------------ ----------
TEST_DEF2 TABLE .0625
TEST_DEF2_PK INDEX .0625
Mit der Klausel SEGMENT CREATION IMMEDIATE wird sofort bei der Erstellung der Tabelle auch je ein Segment für Tabelle und Index angelegt.
Und jetzt zu den ersten Inserts:
set timing on
insert into test_def1 values(1);
1 row created.
Elapsed: 00:00:00.18
insert into test_def2 values(1);
1 row created.
Elapsed: 00:00:00.01
insert into test_def1 values(2);
1 row created.
Elapsed: 00:00:00.01
insert into test_def2 values(2);
1 row created.
Elapsed: 00:00:00.01
Wie erwartet dauert der erste Insert länger, weil die Segmente für Tabelle und Index erst angelegt werden müssen. Und hier noch der Beweis, dass die Segmente angelegt wurden:
select segment_name, segment_type, bytes/1024/1024 MB from user_segments where segment_name like 'TEST_DEF%';
SEGMENT_NAME SEGMENT_TYPE MB
---------------------- ------------------------------ ----------
TEST_DEF1 TABLE .0625
TEST_DEF1_PK INDEX .0625
TEST_DEF2 TABLE .0625
TEST_DEF2_PK INDEX .0625
Es gibt leider in diesem Release einige Objekte auf die das neue Feature nicht angewendet werden kann:
Wenn eine Tabelle einmal gefüllt war, bleibt das Segment bestehen, auch wenn ein Truncate oder Alter Table Kommando abesetzt wurde.
Letztendlich bietet diese neue Art der Speicherplatzverwaltung Vorteile, vor allem wenn es sich um große Softwareinstallationen handelt, weil kein unnötiger Platz im Tablespace verschwendet wird.
Mehr Informationen zu den neuen Features von Oracle erhalten Sie auch in unserer Schulung Neuerungen von Oracle 11g (MS1095).
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.