Neue Klausel in der Create Table Anweisung

03.
April
2010
Veröffentlicht von: Bernhard Koch

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...

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

  • Dieser Parameter hat bei einer 11.2 Installation den Defaultwert TRUE.
  • Der Parameter kann auf Session- oder Systemebene geändert werden.
  • Der Tablespace muß Locally Managed sein.

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:

  • Partitionierte Tabellen
  • Index organisierte Tabellen
  • Geclusterte Tabellen
  • Temporäre Tabellen (temporary tables)
  • Externe Tabellen (external tables)
  • Interne Tabellen (X$.., K$..)
  • Auf Typen basierende Tabellen (typed tables)
  • AQ Tables
  • Tabellen der User SYS, SYSTEM, PUBLIC, OUTLN und XDB

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 Opens internal link in current windowNeuerungen von Oracle 11g (MS1095).

Jede Menge Know-how für Sie!

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.