title image


Smiley ORACLE: Mit delete Tabellen gelöscht, freier Speicher wird nicht größer?
Wie verwaltet ORACLE den Tablespace und die Tabellen



ORACLE benötigt zum Speichern von Tabellen sogenannte Tablespaces. Diese bestehen aus einzelnen Dateien, den Datafiles (oft nur ein einziges).

Für den Anwender der Datenbank ist nur erkennbar, in welchem Tablespace eine Tabelle sich befindet, die Nutzung der unterschiedlichen Datafiles geschieht für den Anwender transparent.



Anlegen einer Tabelle



Beim Anlegen einer Tabelle mit CREATE TABLE ... kann in den STORAGE-Parametern unter anderem angegeben werden, wie groß das erste Segment sein soll und in welchem Tablespace die Tabelle abgelegt wird.

Beispiel:



-- ============================================================

PROMPT '*** TABLE USERLOG_TAB ***'



DROP TABLE USERLOG_TAB;



CREATE TABLE USERLOG_TAB(

ACTION_DATE_LOCAL date NOT NULL,

ACTION_TYPE number(12) NOT NULL,

USERNAME varchar2(20) NOT NULL,

COMMENT_KEY varchar2(255) ,

COMMENT_ARGS varchar2(255) ,

LAST_CHANGE_TIME_LOCAL date DEFAULT SYSDATE NOT NULL,

LAST_CHANGED_BY varchar2(32) DEFAULT 'INITIAL' NOT NULL,

CONSTRAINT USERLOG_PK PRIMARY KEY (ACTION_DATE_LOCAL, ACTION_TYPE, USERNAME)

) TABLESPACE USERS STORAGE ( INITIAL 17945 K NEXT 8970 K PCTINCREASE 5 );



In diesem Beispiel wird die Tabelle USERLOG_TAB im Tablespace USERS angelegt. Das erste Segment (INITIAL) hat dabei die Größe von knapp 18 MB, das nächste würde mit knapp 9 MB angelegt, wenn es benötigt wird, jedes weitere wird dann 5% größer. Gleichzeitig wird über den Constraint ein Index USERLOG_PK angelegt, dieser liegt im DEFAULT INDEX Tablespace.



Man sieht hier schon, dass selbst ohne einen einzigen Datensatz in der Tabelle schon 18 MB Platz im Tablespace USERS belegt werden.



Veränderungen am Speicherplatz der Tabelle



Im Laufe der Zeit werden in der Tabelle Datensätze INSERTED, UPDATED und DELETED. Solange Datensätze in dem INITIAL-Segment Platz finden, werden sie dort abgelegt. Werden Datensätze gelöscht, so wird der Platz innerhalb des Segments nach einer gewissen Zeit wiederbenutzt. Überschreitet der Nutzungsgrad des Segments eine gewisse Grenze (eingestellt über STORAGE-Parameter PCTUSED und PCTFREE), so wird ein weiteres Segment angelegt. Selbst wenn dieses Segment wieder geleert wird, indem z.B. alle Datensätze mit DELETE gelöscht wurden, wird es aber nicht an den Tablespace zurückgegeben, sondern verbleibt weiterhin für die Tabelle reserviert.

Erst wenn der Platz im Tablespace zur Neige geht (auch hier gibt es PCTUSED und PCTFREE), dann werden solche Segmente wieder freigegeben, um anderen Tabellen zur Verfügung zu stehen. Das INITIAL-Segment einer Tabelle wird aber nie freigegeben werden, ausser die Tabelle wird geDROPped.







diu vive floreque.
Spockus

erreicht am 04.03.2008 09:47:23

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: