11... Tabellen verwalten
Lektion 11: Tabellen verwalten Ziele Ziele Nach dieser Lektion sollten Sie Folgendes können: Tabellen mit geeigneten Speichereinstellungen anlegen Tabellen-Speicherplatz überwachen Tabellen analysieren, um Integrität und Migration zu überprüfen Tabelleninformationen aus dem Data Dictionary abfragen Verschiedene ROWID-Formate umwandeln 11-2 Copyright Oracle Corporation, 1999. All rights reserved. 11-2 Oracle8i Datenbankadministration Teil I
Überblick Überblick Benutzerdaten speichern Reguläre Tabelle Partitionierte Tabelle Index-Organized Tabelle Cluster 11-3 Copyright Oracle Corporation, 1999. All rights reserved. Verschiedene Methoden zum Speichern von Benutzerdaten Es gibt mehrere Methoden, Benutzerdaten in einer Oracle Datenbank zu speichern. Die Daten können in eine der folgenden Tabellen gespeichert werden: reguläre Tabellen partitionierte Tabellen Index-organized Tabellen in einem Cluster abgelegte Tabellen Hinweis: Partitionierte Tabellen, Index-organized Tabellen und in Clustern abgelegte Tabellen werden in anderen Kursen behandelt. Reguläre Tabelle Eine reguläre Tabelle (im Allgemeinen als Tabelle bezeichnet) ist die häufigste Form der Speicherung von Benutzerdaten. Diese Tabelle ist der Default-Typ und wird in dieser Lektion hauptsächlich behandelt. Die Datenbankadministration besitzt nur sehr begrenzten Einfluss auf die Verteilung der Zeilen in einer nicht in einem Cluster abgelegten Tabelle. Zeilen können in jeder beliebigen Reihenfolge, je nach Aktivität auf der Tabelle, abgespeichert werden. Oracle8i Datenbankadministration Teil I 11-3
Lektion 11: Tabellen verwalten Partitionierte Tabelle Eine partitionierte Tabelle ermöglicht skalare Anwendungen. Sie hat folgende Eigenschaften: Eine partitionierte Tabelle besitzt eine oder mehrere Partitionen. Jede Partition speichert die Zeilen, die ihr durch Wertebereich, Hash-Algorithmus oder beide Methoden zusammen zugeteilt wurden. Jede Partition einer partitionierten Tabelle ist ein Segment und kann sich in verschiedenen Tablespaces befinden. Partitionen sind für große Tabellen nützlich, da sie gleichzeitig von verschiedenen Prozessen abgefragt und verändert werden können. Es gibt bestimmte Befehle, um Partitionen in einer Tabelle zu verwalten. Index-Organized Tabellen Eine Index-Organized Tabelle ist eine reguläre Tabelle mit einem Primärschlüssel- Index auf einer oder mehreren Spalten. Anstatt zwei Speicherplätze für die Tabelle und einen B*-Baum-Index zu verwalten, pflegt eine Index-Organized Tabelle nur einen einzigen B*-Baum, der den Primärschlüssel der Tabelle und andere Spaltenwerte enthält. Index-Organized Tabellen bieten einen schnellen, schlüssel-basierten Zugriff auf die Tabellendaten für Abfragen, die Bereiche oder bestimmte Werte suchen. Es wird weniger Speicherplatz benötigt, da die Schlüsselspalten nicht doppelt in der Tabelle und im Index gespeichert werden müssen. Die übrigen Nicht-Schlüsselspalten werden im Index gespeichert, wenn der Indexeintrag dadurch nicht zu groß wird. Für diesen Fall bietet der Oracle Server die OVERFLOW-Klausel. In einem Cluster abgelegte Tabellen In einem Cluster abgelegte Tabellen bieten eine optimale Methode zur Speicherung von Tabellendaten. Ein Cluster besteht aus einer Gruppen von Tabellen, die zusammen gruppiert wurden, da sie gemeinsame Spalten besitzen und oft miteinander verwendet werden. Diese Tabellen verwenden gemeinsam die gleichen Datenblöcke. Cluster besitzen folgende Eigenschaften: Cluster haben einen Cluster-Schlüssel, der die Zeilen identifiziert, die zusammen gespeichert werden sollen. Der Cluster-Schlüssel kann aus einer oder mehreren Spalten bestehen. Die Tabellen in einem Cluster haben Spalten, die mit dem Cluster-Schlüssel korrespondieren. Die Bildung von Clustern ist für die Anwendungen, die die Tabellen verwenden, transparent. Die Daten einer Tabelle, die in einem Cluster abgelegt ist, können genauso verändert werden, wie bei regulären Tabellen. 11-4 Oracle8i Datenbankadministration Teil I
Überblick In einem Cluster abgelegte Tabellen (Fortsetzung) Wenn eine der Spalten des Cluster-Schlüssels geändert wird, kann das zur Folge haben, dass die Zeile an einen anderen Speicherort verlagert wird. Der Cluster-Schlüssel ist unabhängig vom Primärschlüssel. Die Tabellen in einem Cluster können einen Primärschlüssel haben, der der Cluster-Schlüssel sein kann oder aus anderen Spalten besteht. Cluster werden üblicherweise zur Verbesserung der Performance angelegt. Wahlfreie Zugriffe auf Daten in einem Cluster können schneller sein, Full Table Scans auf Tabellen, die in einem Cluster abgelegt sind, sind aber im Allgemeinen langsamer. Oracle8i Datenbankadministration Teil I 11-5
Lektion 11: Tabellen verwalten Aufbau einer Zeile Datenbank-Block Zeilen-Header Spaltenlänge Spaltenwert 11-4 Copyright Oracle Corporation, 1999. All rights reserved. Zeilenformat und -größe Zeilendaten werden in Datenbankblöcken als Datensätze variabler Länge gespeichert. Die Spalten einer Zeile werden im Allgemeinen in der Reihenfolge ihrer Definition gespeichert. NULL-Spalten am Ende der Zeile werden nicht gespeichert. Jede Zeile in einer Tabelle kann eine unterschiedliche Anzahl Spalten haben. Jede Zeile einer Tabelle hat: einen Zeilen-Header: mit der Anzahl der Spalten der Zeile, der Verkettungs- Information und dem Zeilensperren-Status Zeilendaten: für jede Spalte speichert der Oracle Server Spaltenlängen und -wert. Ein Byte wird für die Speicherung der Spaltenlänge verwendet, wenn die Spalte nicht länger als 250 Byte sein kann. Eine Spalte, die länger sein kann, benötigt drei Byte. Die Spaltenwerte werden direkt nach den Spaltenlängen-Bytes gespeichert. Die Zeilen werden direkt aufeinanderfolgend gespeichert. Jede Zeile eines Blocks hat einen Eintrag im Zeilenverzeichnis. Der Eintrag im Zeilenverzeichnis zeigt auf den Anfang der Zeile. 11-6 Oracle8i Datenbankadministration Teil I
Oracle Datentypen Oracle Datentypen Oracle Datentypen Datentyp Benutzerdefiniert Built-In Skalar Collection Beziehung CHAR(N), NCHAR(N) VARCHAR2(N), NVARCHAR2(N) NUMBER(P,S) DATE RAW(N) BLOB, CLOB, NCLOB, BFILE LONG, LONG RAW ROWID, UROWID VARRAY TABLE REF 11-5 Copyright Oracle Corporation, 1999. All rights reserved. Oracle Built-In Datentypen Der Oracle Server bietet verschiedene Built-In Datentypen, um skalare Daten, Collections (Sammlungen) und Beziehungen zu speichern. Skalare Datentypen Zeichendaten. Zeichendaten können entweder mit fester oder variabler Länge in der Datenbank gespeichert werden. Zeichen-Datentypen mit fester Länge, wie CHAR und NCHAR, werden mit aufgefüllten Leerzeichen gespeichert. NCHAR ist ein NLS (National Language Support)-fähiger Datentyp, der die Speicherung von Zeichensätzen mit fester oder variabler Länge ermöglicht. Die maximale Größe (Grenzwert 2000 Bytes pro Zeile) wird durch die Anzahl Bytes bestimmt, die für ein Zeichen gespeichert werden. Default-Wert ist 1 Zeichen bzw. 1 Byte, abhängig vom Zeichensatz. Zeichen-Datentypen mit variabler Länge speichern nur den aktuellen Spaltenwert in seiner aktuellen Länge und können sich deshalb in der Länge (max. 4000 Bytes) der Zeilen unterscheiden. VARCHAR2 und NVARCHAR2 sind Beispiele für Zeichen- Datentypen variabler Länge. Oracle8i Datenbankadministration Teil I 11-7
Lektion 11: Tabellen verwalten Skalare Datentypen (Fortsetzung) Numerische Daten. Zahlen werden in einer Oracle Datenbank immer mit variabler Länge gespeichert. Sie können bis zu 38 signifikante Ziffern speichern. Numerische Datentypen benötigen: ein Byte für den Exponent ein Byte pro zwei signifikanten Ziffern in der Mantisse ein Byte für negative Zahlen, wenn die Anzahl der signifikanten Ziffern weniger als 38 Bytes ist Datentyp DATE. Der Oracle Server speichert Datumsangaben in Feldern mit einer festen Länge von 7 Bytes. Ein Oracle DATE enthält immer einen Zeitwert. Datentyp RAW. Dieser Datentyp dient zur Speicherung von kleinen Binärdaten. Der Oracle Server führt keine Zeichensatz-Konvertierung durch, wenn RAW-Daten über Maschinen eines Netzwerks übertragen werden oder wenn RAW-Daten mit Oracle Utilities von einer Datenbank in eine andere verlagert werden. Die zu speichernden Spaltenwerte können für jede Zeile verschieden lang sein (max. 2000 Bytes). 11-8 Oracle8i Datenbankadministration Teil I
Oracle Datentypen Datentypen für die Speicherung großer Objekte LONG, LONG RAW Eine Spalte in einer Tabelle Bis zu 2 Gigabytes SELECT gibt Daten zurück Daten in Zeile gespeichert Nicht in Objekttypen verwendbar Sequentieller Zugriff auf Teile LOB Mehrere Spalten in einer Tabelle Bis zu 4 Gigabytes SELECT gibt den Locator zurück Daten in Zeile oder außerhalb In Objekttypen verwendbar Wahlfreier Zugriff auf Teile 11-6 Copyright Oracle Corporation, 1999. All rights reserved. Skalare Datentypen für große Objekte (LOBs) Oracle bietet sechs Datentypen zum Speichern von LOBs: CLOB und LONG für große Zeichendaten fester Größe NCLOB für große Zeichendaten fester Größe mit nationalen Zeichensätzen BLOB und LONG RAW zum Speichern unstrukturierter Daten BFILE zum Speichern unstrukturierter Daten in Betriebssystemdateien Die Datentypen LONG und LONG RAW wurden früher für unstrukturierte Daten, wie binäre Bilder, Dokumente oder geografische Informationen, verwendet. Sie werden vor allem wegen Abwärtskompatibilität angeboten. Diese Datentypen wurden durch die LOB-Datentypen abgelöst. LOB-Datentypen unterscheiden sich von LONG und LONG RAW und sind nicht austauschbar. LOBs unterstützen die LONG Anwendungsschnittstelle (API) nicht und umgekehrt. Vergleich der LONG- und LOB-Datentypen Dieser Abschnitt beschreibt den Unterschied zwischen LOB und älteren Typen. Im Weiteren sind mit LONGs die Datentypen LONG und LONG RAW gemeint und mit LOBs alle LOB-Datentypen. LOBs erlauben mehrere LOB-Spalten pro Tabelle bzw. Attribute pro Objekttyp, LONGs nur eine Spalte bzw. ein Attribut. Oracle8i Datenbankadministration Teil I 11-9
Lektion 11: Tabellen verwalten Vergleich der LONG- und LOB-Datentypen (Fortsetzung) Die Obergrenze für LONGs ist 2 Gigabytes; LOBs können bis zu 4 Gigabytes haben. Bei Abfragen geben LOBs den Locator zurück; LONGs geben die Daten zurück. LOBs speichern einen Locator in der Tabelle und die Daten an anderer Stelle, wenn die Größe nicht kleiner als das Maximum (4000 Byte) für den VARCHAR2-Datentyp wird; LONGs speichern alle Daten in der Tabelle. Zusätzlich erlauben LOBs, dass Daten in einem getrennten Segment und Tablespace oder in einer Betriebssystemdatei gespeichert werden. LOBs unterstützen Objekttyp-Attribute (außer NCLOBs); LONGs nicht. LONGs werden hauptsächlich als verkettete Zeilenstücke gespeichert, ein Zeilenstück in einem Block, das auf das nächste Zeilenstück in einem anderen Block verweist. Deshalb muss sequentiell auf sie zugegriffen werden. Im Gegensatz dazu unterstützen LOBs mit einer dateiähnlichen Schnittstelle wahlfreien Zugriff auf die Daten. 11-10 Oracle8i Datenbankadministration Teil I
Oracle Datentypen Datentyp ROWID Eindeutiger Identifier für eine Zeile Zum Lokalisieren einer Zeile verwendet ROWID-Format OOOOOO FFF BBBBBB RRR Datenobjektnummer Relative Dateinummer Blocknummer Zeilennummer 11-7 Copyright Oracle Corporation, 1999. All rights reserved. Datentyp ROWID und UROWID ROWID ist eine Pseudo-Spalte, die mit den anderen Spalten einer Tabelle abgefragt werden kann. Sie besitzt folgende Eigenschaften: ROWID ist ein eindeutiger Identifier für jede Zeile der Datenbank. ROWID wird nicht explizit als Spaltenwert gespeichert. Obwohl die ROWID nicht direkt die physikalische Adresse einer Zeile angibt, kann sie für das Auffinden der Zeile verwendet werden. ROWID bietet den schnellsten Zugriff auf eine Tabellenzeile. ROWIDs werden auch in Indizes gespeichert, um Zeilen mit einem bestimmten Satz von Schlüsselwerten anzugeben. Mit dem Release 8.1 bietet der Oracle Server einen neuen Datentyp, der UROWID (Universal Rowid) genannt wird. Dieser unterstützt Rowids von Fremdtabellen (Nicht Oracle Tabellen) und kann alle Arten von Rowids speichern. Um UROWID zu verwenden, muss der Wert des Parameters COMPATIBLE auf 8.1 oder höher gesetzt werden. ROWID-Format ROWID braucht 10 Bytes auf der Platte und wird mit 18 Zeichen angezeigt. Sie besteht aus den folgenden Komponenten: Datenobjektnummer: wird jedem Datenobjekt, wie Tabelle oder Index, beim Anlegen zugewiesen und ist innerhalb der Datenbank eindeutig Relative Dateinummer: ist für jede Datei innerhalb eines Tablespace eindeutig Oracle8i Datenbankadministration Teil I 11-11
Lektion 11: Tabellen verwalten ROWID-Format (Fortsetzung) Blocknummer: steht für die Position des Blocks, der die Zeile enthält, innerhalb der Datei Zeilennummer: gibt die Position des Eintrags im Zeilenverzeichnis des Block- Header an Intern benötigt die Datenobjektnummer 32 Bits, die relative Dateinummer 10 Bits, die Blocknummer 22 Bits und die Zeilennummer 16 Bits. Dadurch ergibt sich eine Summe von 80 Bits bzw. 10 Bytes. Die ROWID wird anhand eines Codierschemas zur Basis 64 angezeigt, das sechs Stellen für die Datenobjektnummer, drei Stellen für die relative Dateinummer, sechs Stellen für die Blocknummer und drei Stellen für die Zeilennummer verwendet. Das Codierschema zur Basis 64 verwendet die Zeichen A-Z a-z 0-9 + und / ; insgesamt 64 Zeichen. Es ist im folgenden Beispiel zu sehen: SQL> SELECT id, ROWID FROM summit.department; ID ROWID --------- ------------------ 10 AAADC4AACAAAAMAAAA 31 AAADC4AACAAAAMAAAB 32 AAADC4AACAAAAMAAAC 33 AAADC4AACAAAAMAAAD 34 AAADC4AACAAAAMAAAE 35 AAADC4AACAAAAMAAAF 41 AAADC4AACAAAAMAAAG 42 AAADC4AACAAAAMAAAH 43 AAADC4AACAAAAMAAAI 44 AAADC4AACAAAAMAAAJ 45 AAADC4AACAAAAMAAAK 50 AAADC4AACAAAAMAAAL In diesem Beispiel ist: AAADC4 die Datenobjektnummer AAC die relative Dateinummer AAAAMA die Blocknummer AAA die Zeilennummer für die Abteilung mit ID=10 11-12 Oracle8i Datenbankadministration Teil I
Oracle Datentypen Zeilen mit ROWID lokalisieren Da ein Segment nur in einem Tablespace gespeichert sein kann, kann der Oracle Server mit der Datenobjektnummer den Tablespace bestimmen, der die Zeile enthält. Mit der relativen Dateinummer im Tablespace wird die Datei bestimmt, mit der Blocknummer der Block, der die Zeile enthält, und mit der Zeilennummer der Eintrag im Zeilenverzeichnis für diese Zeile. Mit dem Eintrag im Zeilenverzeichnis wird der Anfang der Zeile lokalisiert. So kann mit der ROWID jede Zeile innerhalb der Datenbank lokalisiert werden. Oracle8i Datenbankadministration Teil I 11-13
Lektion 11: Tabellen verwalten Eingeschränkte ROWID Kann eine Zeile innerhalb eines Segments identifizieren Benötigt weniger Speicherplatz BBBBBBBB. RRRR. FFFF Blocknummer Zeilennummer Dateinummer 11-8 Copyright Oracle Corporation, 1999. All rights reserved. Eingeschränkte ROWID in Oracle7 und früheren Versionen Versionen vor dem Oracle8 Server verwenden das eingeschränkte ROWID-Format. Ein eingeschränktes ROWID-Format benutzt intern nur sechs Bytes und enthält keine Datenobjektnummer. Dieses Format war bei Oracle7 (oder früheren Versionen) akzeptabel, da die Dateinummern innerhalb der Datenbank eindeutig waren. Die früheren Versionen erlaubten nicht mehr als 1022 Datendateien. Oracle8 hat diese Einschränkung durch die Verwendung von Tablespace-relativen Dateinummern aufgehoben. Eingeschränkte ROWIDs werden aber weiterhin bei Objekten, wie nicht-partitionierten Indizes oder nicht-partitionierten Tabellen verwendet, bei denen alle Index-Einträge auf Zeilen im selben Segment verweisen. 11-14 Oracle8i Datenbankadministration Teil I
Oracle Datentypen Collections (Sammlungen) Collections sind Objekte, die Objekte enthalten VARRAYs sind geordnete Mengen von Elementen, die eine Zähler und einen Grenzwert enthalten Verschachtelte Tabellen mit einer Spalte oder Variable vom Datentyp TABLE. VARRAY Verschachtelte Tabelle 11-9 Copyright Oracle Corporation, 1999. All rights reserved. Datentypen für Collections (Sammlungen) Es gibt zwei Datentypen für Collections, welche Daten speichern, die sich in einer bestimmten Tabellenzeile wiederholen. Vor Oracle8i wurde die Object-Option benötigt, um Collections zu definieren und zu verwenden. Es folgt eine kurze Besprechung dieser Typen. Variable Arrays (VARRAYs). Variable Arrays sind zum Speichern von Listen nützlich, die eine kleine Anzahl von Elementen enthalten, wie z.b. Telefonnummern für einen Kunden. VARRAYs besitzen die folgenden Eigenschaften: Ein Array ist eine geordnete Menge von Datenelementen. Alle Elemente eines bestimmten Array sind vom selben Datentyp. Jedes Element besitzt einen Index; das ist eine Nummer, die die Position des Elements im Array angibt. Die Anzahl der Elemente im Array ist die Größe des Array. Der Oracle Server erlaubt Arrays variabler Größe, sie werden deshalb VARRAYs genannt. Die maximale Größe muss aber bei der Deklaration des Array-Typs angegeben werden. Oracle8i Datenbankadministration Teil I 11-15
Lektion 11: Tabellen verwalten Datentypen für Collections (Fortsetzung) Verschachtelte Tabellen. Verschachtelte Tabellen bieten die Möglichkeit, eine Tabelle als Spalte einer anderen Tabelle zu definieren. Sie können Mengen speichern, die eine große Anzahl von Datensätzen haben, wie z.b Posten einer Bestellung. Verschachtelte Tabellen haben im Allgemeinen die folgenden Eigenschaften: Eine verschachtelte Tabelle ist eine ungeordnete Menge von Datensätzen oder Zeilen. Alle Zeilen einer verschachtelten Tabelle haben die gleiche Struktur. Die Zeilen einer verschachtelten Tabelle werden getrennt von der Vater-Tabelle gespeichert. In der korrespondierenden Zeile der Vater-Tabelle weist ein Zeiger auf die verschachtelte Tabelle. Die Datenbankadministration kann Speichereigenschaften für die verschachtelte Tabelle festlegen. Es gibt keine vordefinierte Maximalgröße für eine verschachtelte Tabelle. Datentyp für Beziehungen (REF) Beziehungstypen werden als Zeiger innerhalb der Datenbank verwendet. Die Object- Option ist nötig, um Beziehungstypen zu verwenden. Beispielsweise kann jeder bestellte Posten auf eine Zeile in der Tabelle PRODUCTS verweisen, ohne den Produktcode zu speichern. Benutzerdefinierte Datentypen Der Oracle Server erlaubt Benutzern abstrakte Datentypen zu definieren und in ihrer Anwendung zu verwenden. Diese Funktion erfordert die Object-Option. 11-16 Oracle8i Datenbankadministration Teil I
Tabelle anlegen Tabelle anlegen Tabelle anlegen CREATE TABLE employee( id NUMBER(7), last_name VARCHAR2(25), dept_id NUMBER(7)) PCTFREE 20 PCTUSED 50 STORAGE(INITIAL 200K NEXT 200K PCTINCREASE 0 MAXEXTENTS 50) TABLESPACE data; 11-10 Copyright Oracle Corporation, 1999. All rights reserved. Syntax Mit dem folgenden Befehl legen Sie eine Tabelle an: CREATE TABLE [schema.] table (column datatype [, column datatype ]...) [TABLESPACE tablespace ] [ PCTFREE integer ] [ PCTUSED integer ] [ INITRANS integer ] [ MAXTRANS integer ] [ STORAGE storage-clause ] [LOGGING NOLOGGING] [CACHE NOCACHE] ] mit: schema Eigentümer der Tabelle table Name der Tabelle column Name der Spalte datatype Datentyp der Spalte Oracle8i Datenbankadministration Teil I 11-17
Lektion 11: Tabellen verwalten Syntax (Fortsetzung) TABLESPACE PCTFREE PCTUSED INITRANS MAXTRANS STORAGE LOGGING NOLOGGING CACHE NOCACHE Tablespace, in dem die Tabelle angelegt wird Speicherplatz (als Prozentsatz des gesamten Blocks ohne Block-Header), der in jedem Block für länger werdende Zeilen reserviert wird untere Grenze des im Block verwendeten Speicherplatzes (nachdem bis PCTFREE aufgefüllt wurde), die festlegt, wann ein Block für das Einfügen von Zeilen wieder zur Verfügung steht initiale Anzahl der Transaktionseintragsbereiche, die in jedem Block zur Verfügung stehen. Default-Wert ist 1. beschränkt die Anzahl der Transaktionseinträge im Block. Default- Wert ist 255. Storage -Klausel, die festlegt, wie Extents für die Tabelle belegt werden legt fest, dass das Anlegen der Tabelle in der Redo Log-Datei protokolliert wird. Damit wird auch festgelegt, dass alle nachfolgenden Operationen auf der Tabelle protokolliert werden. Default-Wert. legt fest, dass das Anlegen der Tabelle und bestimmte Arten des Daten-Ladens in der Redo Log-Datei nicht protokolliert werden legt fest, dass bei einem Full Table Scan die für diese Tabelle gelesenen Blöcke im Cache-Buffer an den Kopf (most recently used) der LRU-Liste gestellt werden legt fest, dass bei einem Full Table Scan die für diese Tabelle gelesenen Blöcke im Cache-Buffer ans Ende (least recently used) der LRU-Liste gestellt werden 11-18 Oracle8i Datenbankadministration Teil I
Tabelle anlegen Syntax (Fortsetzung) Hinweise Im Allgemeinen sollten Tabellen mit einem Primärschlüssel angelegt werden. Die Pflege von Constraints wird in Lektion Datenintegrität verwalten besprochen. Wenn MINIMUM EXTENT für den Tablespace angegeben wird, wird die Extent- Größe für die Tabelle auf das nächsthöhere Vielfache des Werts von MINIMUM EXTENT aufgerundet. Wenn die Klausel [NO]LOGGING weggelassen wird, wird das Protokoll-Attribut der Tabelle defaultmäßig auf den Wert gesetzt, der für den zugehörigen Tablespace gilt. Wenn für MINEXTENTS ein Wert größer als 1 angegeben wurde und der Tablespace mehr als eine Datendatei enthält, dann werden die Extents über verschiedene Dateien im Tablespace verteilt. Bestehende Tabelle kopieren Mit dem Befehl CREATE TABLE mit einer Unterabfrage können Sie eine bestehende Tabelle vollständig oder teilweise kopieren. Die vereinfachte Syntax für diesen Befehl lautet: CREATE TABLE [schema.]table [ LOGGING NOLOGGING ]... AS subquery Die anderen Klauseln, wie TABLESPACE, STORAGE und die Block- Speicherausnutzungsparameter können angegeben werden, wenn eine Tabelle erzeugt wird, die auf einer anderen Tabelle basiert. Mit der Klausel NOLOGGING unterdrücken Sie die Erzeugung von Redo Log-Einträgen und beschleunigen damit die Erzeugung der Tabelle. Constraints, Trigger und Tabellen-Privilegien werden auf diese Weise nicht in die neue Tabelle kopiert. Wenn eine Spalte in der Original-Tabelle als NOT NULL definiert ist, wird die entsprechende Spalte der neuen Tabelle ebenfalls als NOT NULL definiert. Oracle8i Datenbankadministration Teil I 11-19
Lektion 11: Tabellen verwalten So erzeugen Sie eine Tabelle mit dem Schema Manager Test 11-1 1 Starten Sie den Schema Manager: Start >Programs >Oracle - EMV2 Home >DBA Management Pack >Schema Manager 2 Melden Sie sich direkt bei der Datenbank an. Geben Sie den Administrator system, das Passwort manager und den Service your working database ein und klicken Sie OK. 3 Wählen Sie Object >Create aus der Menüleiste. 4 Wählen Sie Table in der Objektliste, wählen Sie die Option Use Wizard und klicken Sie Create. 5 Geben Sie die Tabellen-Informationen im Table Wizard ein, z.b. den Tabellennamen, Tablespace, Eigentümer, Spalten und Datentypen sowie Größenangaben. Klicken Sie Finish. 6 Erweitern Sie den Ordner Tables, um die neue Tabelle zu überprüfen. Sie können auch eine bestehende Tabelle im Navigator auswählen und mit Object >Create Like eine neue Tabelle mit denselben Spalten und Speichereigenschaften anlegen. Andere Optionen. Mit dem Oracle Schema Manager können Sie automatisch Speicher und Block-Speicherausnutzungsparameter vom Tool definieren lassen, basierend auf einer Schätzung des Anfangsumfangs, der Wachstumsrate und der DML-Aktivität für die Tabelle. 11-20 Oracle8i Datenbankadministration Teil I
Tabelle anlegen Temporäre Tabellen Die Zeilen sind privat für die Session. CREATE GLOBAL TEMPORARY TABLE employee_temp AS SELECT * FROM employee; Die Tabellen enthalten Daten nur für die Dauer einer Transaktion oder Session. ON COMMIT PRESERVE ROWS; DML-Sperren werden für die Daten nicht angefordert. DMLs erzeugen keine Redo Logs. 11-11 Copyright Oracle Corporation, 1999. All rights reserved. Temporäre Tabellen Zusätzlich zu permanenten Tabellen können Sie temporäre Tabellen für Daten innerhalb einer Session erzeugen, die nur für die Dauer einer Transaktion oder Session existieren. Der Befehl CREATE GLOBAL TEMPORARY TABLE erzeugt eine temporäre Tabelle, die transaktions-spezifisch oder session-spezifisch sein kann. Bei transaktions-spezifischen temporären Tabellen existieren die Daten nur für die Dauer der Transaktion, bei session-spezifischen Tabellen nur für die Dauer der Session. Daten einer Session sind für diese Session privat. Jede Session kann nur ihre eigenen Daten sehen und ändern. DML-Sperren sind für Daten in temporären Tabellen nicht erforderlich. Folgende Klauseln steuern die Lebensdauer von Zeilen: ON COMMIT DELETE ROWS gibt an, dass Zeilen nur innerhalb der Transaktion sichtbar sind ON COMMIT PRESERVE ROWS gibt an, dass Zeilen für die gesamte Session sichtbar sind Sie können für temporäre Tabellen Indizes, Views und Trigger erzeugen. Sie können mit den Export- und Import-Utilities die Definition der temporären Tabelle exportieren bzw. importieren. Es werden jedoch keine Daten exportiert, auch wenn die ROWS- Option angegeben wird. Die Definition der temporären Tabelle ist für alle Sessions sichtbar. Oracle8i Datenbankadministration Teil I 11-21
Lektion 11: Tabellen verwalten Tabelle anlegen: Richtlinien Verwenden Sie wenige Standard-Extent-Größen für Tabellen, um Tablespace-Fragmentierung zu reduzieren. Verwenden Sie lokal verwaltete Tablespaces, um Fragmentierung zu vermeiden. Verwenden Sie die CACHE-Klausel für häufig benutzte, kleine Tabellen. 11-12 Copyright Oracle Corporation, 1999. All rights reserved. Richtlinien für das Anlegen einer Tabelle Legen Sie Tabellen in getrennte Tablespaces, aber nicht in den Tablespace, der Rollback-Segmente, temporäre Segmente und Indizes enthält. Plazieren Sie Tabellen in lokal verwaltete Tablespaces, um Fragmentierung zu vermeiden. Verwenden Sie wenige Standard-Extent-Größen, die ein Vielfaches von 5 DB_BLOCK_SIZE betragen, um die Fragmentierung zu reduzieren. Um die Performance bei Full Table Scans zu verbessern, richten Sie die Extent- Größen an DB_FILE_MULTIBLOCK_READ_COUNT aus. Dies ist ein Initialisierungsparameter, der die Anzahl der Blöcke festlegt, welche die Server- Prozesse beim Lesen der ganzen Tabelle bei jedem Leseaufruf ans Betriebssystem anfordern. Verwenden Sie die Klausel CACHE für kleine Referenz-Tabellen, auf die wahrscheinlich sehr häufig zugegriffen wird. 11-22 Oracle8i Datenbankadministration Teil I
Tabelle anlegen PCTFREE und PCTUSED setzen PCTFREE berechnen (Durchschn. Zeilenlänge - Anfängliche Zeilenlänge) * 100 Durchschnittliche Zeilenlänge PCTUSED berechnen 100 - PCTFREE - Durchschn. Zeilenlänge * 100 Verfügbarer Speicherplatz 11-13 Copyright Oracle Corporation, 1999. All rights reserved. PCTFREE setzen Ein höherer PCTFREE bietet mehr Platz für Änderungen im Datenbank-Block. Setzen Sie einen höheren Wert, wenn die Tabelle Spalten enthält: die zuerst NULL sind und später mit einem Wert belegt werden die wahrscheinlich aufgrund von Änderungen wachsen Ein höherer PCTFREE ergibt eine niedrigere Blockdichte an; jeder Block kann weniger Zeilen enthalten. Die oben genannte Formel stellt sicher, dass es im Block genügend freien Speicherplatz für Zeilenwachstum gibt. PCTUSED setzen Setzen Sie PCTUSED, um sicherzustellen, dass der Block nur dann auf die Freispeicherliste gesetzt wird, wenn es genügend Speicherplatz zur Aufnahme einer durchschnittlichen Zeile gibt. Wenn ein Block aus der Freispeicherliste nicht ausreichend Speicherplatz für das Einfügen einer Zeile enthält, sucht der Oracle Server den nächsten Block auf der Freispeicherliste. Dies wird solange fortgesetzt, bis ein Block mit genug Speicherplatz gefunden oder das Ende der Liste erreicht ist. Die Verwendung der Formel reduziert die Suche in der Freispeicherliste, da die Wahrscheinlichkeit für Blöcke mit genügend freiem Speicherplatz größer wird. Hinweis: Der Wert für die durchschnittliche Zeilengröße kann mit dem Befehl ANALYZE TABLE abgeschätzt werden, der in einem nachfolgenden Abschnitt beschrieben ist. Oracle8i Datenbankadministration Teil I 11-23
Lektion 11: Tabellen verwalten Zeilenmigration und -verkettung Vor der Aktualisierung Nach der Aktualisierung Pointer 11-14 Copyright Oracle Corporation, 1999. All rights reserved. Zeilenmigration Wenn PCTFREE einen niedrigen Wert hat, kann es zuwenig Speicherplatz im Block geben, um eine durch Änderungen wachsende Zeile aufzunehmen. In diesem Fall verlagert der Oracle Server die ganze Zeile in einen anderen Block und setzt im Original-Block einen Zeiger zum neuen Speicherort. Dieser Vorgang wird als Zeilenmigration bezeichnet. Wenn eine Zeile migriert wurde, verringert sich die zugehörige I/O-Performance, da der Oracle Server zwei Blöcke durchsuchen muss, um die Zeile abzurufen. Zeilenverkettung Zeilenverkettung tritt dann auf, wenn eine Zeile zu groß ist, um in einen Block zu passen. Dies kann bei sehr langen Spalten der Fall sein. Der Oracle Server teilt in diesem Fall die Zeile in kleinere Teile, Zeilenstücke genannt. Jedes Zeilenstück wird in einem Block gespeichert, zusammen mit den nötigen Zeigern, um die ganze Zeile abzurufen und wieder zusammenzusetzen. Durch eine größere Blockgröße oder, wenn möglich, die Aufteilung einer Tabelle in mehrere Tabellen mit weniger Spalten kann die Zeilenverkettung minimiert werden. Hinweis: Zeilenmigration und Zeilenverkettung werden im Einzelnen im Kurs Oracle 8i: Performance Tuning behandelt. 11-24 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen Tabellen-Speicherplatz überwachen Speicherparameter und Parameter zur Block-Speicherausnutzung ändern ALTER TABLE summit.employee PCTFREE 30 PCTUSED 50 STORAGE(NEXT 500K MINEXTENTS 2 MAXEXTENTS 100); 11-15 Copyright Oracle Corporation, 1999. All rights reserved. Parameter für Speicherplatz und Blockausnutzung ändern Mit dem Befehl ALTER TABLE können einige der Speicherparameter und alle Parameter zur Blockausnutzung geändert werden. Syntax ALTER TABLE [schema.]table {[ storage-clause ] [ PCTFREE integer ] [ PCTUSED integer ] [ INITRANS integer ] [ MAXTRANS integer]} Auswirkungen der Änderung von Speicherparametern Im Folgenden werden die Parameter, die geändert werden können, und die Auswirkungen einer Änderung besprochen: NEXT: Wenn der Oracle Server einen neuen Extent für die Tabelle anfordert, wird dieser Wert verwendet. Nachfolgende Extent-Größen werden um PCTINCREASE erhöht. Oracle8i Datenbankadministration Teil I 11-25
Lektion 11: Tabellen verwalten Auswirkungen der Änderung von Speicherparametern (Fortsetzung) PCTINCREASE: Eine Änderung von PCTINCREASE wird ins Data Dictionary eingetragen. Dieser Wert wird zur Berechnung von NEXT verwendet, wenn der nächste Extent vom Oracle Server angefordert wird. Betrachten wir eine Tabelle mit zwei Extents: NEXT=10K und PCTINCREASE=0. Wenn PCTINCREASE auf 100 geändert wird, dann wird der dritte Extent mit 10K angefordert, der vierte mit 20K usw. MINEXTENTS: MINEXTENTS kann auf jeden Wert unter oder gleich der aktuellen Anzahl von Extents in der Tabelle gesetzt werden. Es gibt keine direkten Auswirkungen, der Wert wird aber verwendet, wenn die Tabelle geleert wird. MAXEXTENTS: MAXEXTENTS kann auf jeden Wert gleich oder größer der aktuellen Anzahl von Extents in der Tabelle gesetzt werden. Einschränkungen. INITIAL kann für eine Tabelle nicht geändert werden. Der angegebene Wert für NEXT wird auf ein Vielfaches der Blockgröße aufgerundet, die größer oder gleich dem angegebenen Wert ist. Parameter zur Block-Speicherausnutzung Die Parameter zur Block-Speicherausnutzung können geändert werden: um die Speicherausnutzung zu verbessern um die Möglichkeit von Migration zu verringern Es treten folgende Auswirkungen beim Ändern der Parameter zur Block- Speicherausnutzung auf: PCTFREE: Eine Änderung von PCTFREE beeinflusst zukünftiges Einfügen. Blöcke, die nicht zum Einfügen verwendet werden, da sie bereits auf (100/PCTFREE) gefüllt sind, sind nicht betroffen, bis sie wieder in die Freispeicherliste gestellt werden. Sie können nur dann in die Freispeicherliste gestellt werden, wenn ihre Ausnutzung unter PCTUSED fällt. PCTUSED: Jede Änderung von PCTUSED beeinflusst alle Blöcke in der Tabelle. Wenn eine Zeile geändert oder gelöscht wird, wird der Block, der die Zeile enthält, auf seine Ausnutzung überprüft und nur dann zum Einfügen wiederverwendet, wenn die Ausnutzung unter PCTUSED liegt. INITRANS: Eine Änderung von INITRANS beeinflusst nur neue Blöcke. MAXTRANS: Eine Änderung von MAXTRANS beeinflusst alle Blöcke in der Tabelle. 11-26 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen So ändern Sie mit dem Oracle Enterprise Manager Speicherparameter 1 Starten Sie den Schema Manager und melden Sie sich direkt bei der Datenbank an: Start >Programs >Oracle - EMV2 Home >DBA Management Pack >Schema Manager 2 Geben Sie die Anmelde-Informationen ein und klicken Sie OK. 3 Erweitern Sie den Ordner Tables. 4 Erweitern Sie den Benutzernamen (bzw. den Schemanamen). 5 Wählen Sie die Tabelle. 6 Ändern Sie die Werte im Storage-Register des Eigenschaftsfensters. Beachten Sie, dass Minimum Extents und Initial Number of Transactions auf diese Weise nicht geändert werden können. 7 Klicken Sie Apply. Oracle8i Datenbankadministration Teil I 11-27
Lektion 11: Tabellen verwalten Extents manuell allokieren ALTER TABLE summit.employee ALLOCATE EXTENT(SIZE 500K DATAFILE /DISK3/DATA01.DBF ); 11-16 Copyright Oracle Corporation, 1999. All rights reserved. Extents manuell allokieren Es kann nötig sein, Extents manuell zu allokieren: um die Verteilung der Extents einer Tabelle auf Dateien zu steuern um dynamische Erweiterungen von Tabellen zu vermeiden, wenn große Mengen von Daten geladen werden sollen Syntax Mit dem folgenden Befehl allokieren Sie einen Extent für eine Tabelle: ALTER TABLE [schema.]table ALLOCATE EXTENT [ ([SIZE integer [K M]] [ DATAFILE filename ]) ] Wenn SIZE weggelassen wird, verwendet der Oracle Server den Wert von NEXT_EXTENT aus DBA_TABLES, um den Extent zu allokieren. Die Datei, die in der Klausel DATAFILE angegeben wird, muss zum Tablespace der Tabelle gehören. Andernfalls läuft die Anweisung auf einen Fehler. Wird die Klausel DATAFILE weggelassen, allokiert der Oracle Server den Extent in einer der Dateien, die zum Tablespace der Tabelle gehören. Hinweis: Der Wert von NEXT_EXTENT in DBA_TABLES beeinflusst nicht die manuelle Allokierung von Extents. Der Oracle Server berechnet nicht die neue Größe des nächsten Extents, wenn dieser Befehl ausgeführt wird. 11-28 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen Nicht-partitionierte Tabelle reorganisieren ALTER TABLE employee MOVE TABLESPACE data1; Verlagert Daten in ein neues Segment. Dabei bleiben Indizes, Constraints, Privilegien usw. für die Tabelle erhalten. Wird für das Verlagern einer Tabelle in einen anderen Tablespace oder zum Reorganisieren von Extents verwendet. 11-17 Copyright Oracle Corporation, 1999. All rights reserved. Speicherort für Tabelle ändern und Tabelle reorganisieren Mit Oracle8i kann eine nicht-partitionierte Tabelle ohne Export und Import verlagert werden. Dies ist in folgenden Fällen nützlich: beim Verlagern einer Tabelle von einem Tablespace in einen anderen beim Reorganisieren einer Tabelle, um Zeilenmigration zu beseitigen Nach dem Verlagern einer Tabelle müssen Sie die Indizes wieder aufbauen, um folgenden Fehler zu vermeiden: SQL> select * from employee where id=23; select * from employee where id=23 * ERROR at line 1: ORA-01502: index 'SUMMIT.EMPLOYEE_ID_PK' or partition of such index is in unusable state Oracle8i Datenbankadministration Teil I 11-29
Lektion 11: Tabellen verwalten High-Watermark Nach dem Einfügen: Extent-ID 0 1 2 3 4 Nach dem Löschen: High-Watermark Extent-ID 0 1 2 3 4 Belegter Block Nicht belegter Block 11-18 Copyright Oracle Corporation, 1999. All rights reserved. Freier Speicherplatz nach Löschen Was ist die High-Watermark? Die High-Watermark einer Tabelle gibt den letzten Block an, der jemals für die Tabelle verwendet wurde. Wenn Daten in die Tabelle eingefügt werden, wird die High-Watermark auf den letzten verwendeten Block hochgesetzt. Die High-Watermark wird nicht zurückgesetzt, wenn Zeilen aus der Tabelle gelöscht werden. Die High-Watermark wird im Segment-Header der Tabelle gespeichert. Wenn der Oracle Server einen Full Table Scan durchführt, liest er alle Blöcke bis zur High-Watermark. 11-30 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen High-Watermark bestimmen: DBMS_SPACE.UNUSED_SPACE TOTAL_BLOCKS UNUSED_BLOCKS Extent-ID 0 1 2 3 4 High-Watermark LAST_USED_EXTENT_FILE_ID, LAST_USED_EXTENT_BLOCK_ID 11-19 Copyright Oracle Corporation, 1999. All rights reserved. So finden Sie die High-Watermark Das Package DBMS_SPACE enthält eine Prozedur, die die High-Watermark und die Anzahl Blöcke oberhalb der High-Watermark auffindet. Diese Informationen können auch aus dem Data Dictionary ermittelt werden, nachdem die Tabelle analysiert wurde, das Package DBMS_SPACE bietet aber einen schnelleren Zugriff auf die Informationen, ohne die Arbeit des Optimizers zu beeinflussen. Syntax Der folgende PL/SQL-Block kann die Anzahl der Blöcke, die für eine Tabelle angefordert sind, und die Anzahl nicht verwendeter Blöcke suchen und ausgeben: SQL> DECLARE 2 v_owner VARCHAR2(30) := 'SUMMIT' ; 3 v_segment_name VARCHAR2(30) := 'EMPLOYEE'; 4 v_segment_type VARCHAR2(30) := 'TABLE'; 5 v_total_blocks NUMBER; 6 v_total_bytes NUMBER; 7 v_unused_blocks NUMBER; 8 v_unused_bytes NUMBER; 9 v_last_used_extent_file_id NUMBER; 10 v_last_used_extent_block_id NUMBER; Oracle8i Datenbankadministration Teil I 11-31
Lektion 11: Tabellen verwalten Syntax (Fortsetzung) 11 v_last_used_block NUMBER; 12 BEGIN 13 dbms_space.unused_space(v_owner, 14 v_segment_name, 15 v_segment_type, 16 v_total_blocks, 17 v_total_bytes, 18 v_unused_blocks, 19 v_unused_bytes, 20 v_last_used_extent_file_id, 21 v_last_used_extent_block_id, 22 v_last_used_block 23 ); 24 dbms_output.put_line(initcap(v_segment_type) ' : ' v_owner '.' v_segment_name); 25 dbms_output.put_line('total Blocks : ' TO_CHAR(v_total_blocks)); 26 dbms_output.put_line('blocks above HWM : ' TO_CHAR(v_unused_blocks)); 27 END; 28 / Statement processed. Table : SUMMIT.EMPLOYEE Total Blocks : 25 Blocks above HWM : 23 Hinweis: Das Package DBMS_SPACE wird erzeugt, wenn catproc.sql die Skripts dbmsutil.sql und prvtutil.plb aufruft. 11-32 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen Nicht verwendeten Speicher freigeben Extent-ID 0 1 2 3 4 Vor der Speicherfreiga be ALTER TABLE summit.employee DEALLOCATE UNUSED; High-Watermark Extent-ID 0 1 2 3 4 Nach der Speicherfreiga be Belegter Block Nicht belegter Block Freier Speicherplatz nach Löschen 11-20 Copyright Oracle Corporation, 1999. All rights reserved. Freigeben von nicht verwendetem Speicherplatz Wenn einer Tabelle große Extents zugewiesen wurden, diese aber nicht ganz ausgenutzt sind, ist es möglich, manuell Speicherplatz der Tabelle freizugeben. Der so freigegebene Speicherplatz wird für andere Segmente im Tablespace verfügbar. Syntax Mit dem folgenden Befehl geben Sie nicht verwendeten Speicherplatz einer Tabelle frei: ALTER TABLE [schema.]table DEALLOCATE UNUSED [KEEP integer [ K M ] ] KEEP gibt die Anzahl Bytes über der High-Watermark an, die zurückbehalten wird. Wird die Klausel KEEP weggelassen, dann gibt der Oracle Server den ganzen nicht verwendeten Speicherplatz über der High-Watermark frei. Wenn die High-Watermark einen Extent niedriger als MINEXTENTS steht, gibt der Oracle Server die Extents oberhab MINEXTENTS frei. Betrachten Sie das Beispiel auf der Folie. Wenn MINEXTENTS für die Tabelle vier oder weniger beträgt, gibt der Oracle Server alle nicht verwendeten Blöcke oberhalb der High-Watermark frei. Beachten Sie, dass der fünfte Extent (mit ID=4) jetzt nur fünf Blöcke enthält. Wenn MINEXTENTS für die Tabelle fünf gewesen wäre, hätte der Oracle Server keinen Speicherplatz aus dem fünften Extent freigegeben. Oracle8i Datenbankadministration Teil I 11-33
Lektion 11: Tabellen verwalten Syntax (Fortsetzung) Hinweis Da die Freigabe von Speicherplatz mit diesem Befehl Speicherplatz freigibt, der nicht im Extent verwendet wird, führt die häufige Verwendung dieses Befehls zur Fragmentierung der Datendateien. Setzen Sie MINIMUM EXTENT für den Tablespace, um dies zu vermeiden. 11-34 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen Tabelle leeren TRUNCATE TABLE summit.employee; Extent-ID 0 1 High- Watermark Freier Speicherplatz 11-21 Copyright Oracle Corporation, 1999. All rights reserved. Tabelle leeren Das Leeren einer Tabelle löscht alle Zeilen der Tabelle und gibt den verwendeten Speicherplatz frei. Im Beispiel auf der Folie wird angenommen, dass die aktuelle Einstellung von MINEXTENTS für die Tabelle 2 ist. Syntax TRUNCATE TABLE [schema.] table [{DROP REUSE} STORAGE] Der Befehl hat folgende Auswirkungen: Alle Zeilen der Tabelle werden gelöscht. Da TRUNCATE TABLE ein DDL-Befehl ist, werden keine Rollback-Daten angelegt und der Befehl wird implizit festgeschrieben. Zugehörige Indizes werden ebenfalls geleert. Eine Tabelle, die durch einen Fremdschlüssel referenziert wird, kann nicht geleert werden. Die Delete-Trigger werden durch diesen Befehl nicht ausgelöst. Oracle8i Datenbankadministration Teil I 11-35
Lektion 11: Tabellen verwalten Syntax (Fortsetzung) Wenn die Klausel DROP (Default-Einstellung) verwendet wird: Alle Extents, außer den in MINEXTENTS angegebenen, werden freigegeben. Die High-Watermark wird auf den ersten Block in der Tabelle zurückgesetzt. Der Wert von NEXT_EXTENT für die Tabelle wird auf die Größe des freigegebenen Extents mit der niedrigsten Extent-ID zurückgesetzt, d.h., wenn MINEXTENTS 2 ist, wird NEXT_EXTENT auf die Größe des dritten Extent der Tabelle gesetzt. Sie müssen die Klausel REUSE angeben, um den ganzen von der Tabelle verwendeten Speicherplatz zurückzubehalten. Die Klauseln REUSE oder DROP wirken sich kaskadierend auf die Indizes aus. 11-36 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen Tabelle löschen DROP TABLE summit.department CASCADE CONSTRAINTS; 11-22 Copyright Oracle Corporation, 1999. All rights reserved. Tabelle löschen Eine Tabelle kann gelöscht werden, wenn sie nicht mehr benötigt wird oder wenn sie reorganisiert wird. Syntax Mit dem folgenden Befehl können Sie eine Tabelle löschen: DROP TABLE [schema.] table [CASCADE CONSTRAINTS] Wenn die Tabelle gelöscht wird, werden die von der Tabelle verwendeten Extents freigegeben. Wenn sie zusammenhängen, können sie entweder automatisch oder manuell zu einem späteren Zeitpunkt zusammengeführt werden. Hinweis: Die Option CASCADE CONSTRAINTS ist notwendig, wenn die Tabelle die Vater-Tabelle einer Fremdschlüssel-Beziehung ist. Diese Option wird im Einzelnen in der Lektion Datenintegrität verwalten besprochen. So löschen Sie mit dem Oracle Enterprise Manager eine Tabelle 1 Starten Sie den Schema Manager. 2 Erweitern Sie den Ordner Tables. 3 Erweitern Sie den Benutzernamen (bzw. den Schemanamen). 4 Wählen Sie die Tabelle. 5 Wählen Sie Object >Remove. 6 Bestätigen Sie die Dialogbox mit Yes. Oracle8i Datenbankadministration Teil I 11-37
Lektion 11: Tabellen verwalten Spalte aus Tabelle löschen Spalte löschen ALTER TABLE employee DROP COLUMN comments CASCADE CONSTRAINTS CHECKPOINT 1000; Damit wird eine Spalte inklusive gelöscht und damit Speicherplatz im Datenblock freigegeben. Das Löschen einer Spalte in einer großen Tabelle dauert eine beträchtliche Zeit. Nach Instanz-Ausfall abgebrochenes Löschen weiterführen ALTER TABLE order DROP COLUMNS CONTINUE 11-23 Copyright Oracle Corporation, 1999. All rights reserved. Spalte aus einer Tabelle löschen Vor Oracle8i war es nicht möglich eine Spalte aus einer Tabelle zu löschen. Mit Oracle8i können Sie Spalten aus Zeilen in einer Tabelle löschen. Das Löschen von Spalten bereinigt ungenutzte und potentiell platzverschwendende Spalten aus den Tabellen-Zeilen. Sie müssen dabei keine Daten exportieren oder importieren sowie die Indizes und Constraints nicht wieder aufbauen. Das Löschen einer Spalte kann beträchtliche Zeit dauern, da alle Daten dieser Spalte aus der Tabelle gelöscht werden. Checkpoint beim Löschen einer Spalte setzen Das Löschen einer Spalte kann sehr lange dauern und eine große Menge Rollback- Speicherplatz benötigen. Beim Löschen von Spalten aus großen Tabellen können Sie Checkpoints angeben, um den Rollback-Speicherplatz zu minimieren. Im Beispiel auf der Folie tritt ein Checkpoint alle 1000 Zeilen auf. Die Tabelle wird als INVALID markiert, bis die Operation abgeschlossen ist. Falls die Instanz während der Operation abstürzt, bleibt die Tabelle auch nach dem erneuten Hochfahren INVALID und die Operation muss fortgesetzt werden. Mit der folgenden Anweisung setzen Sie eine abgebrochene Lösch-Operation fort: SQL> ALTER TABLE orders DROP COLUMNS CONTINUE; Diese Anweisung erzeugt einen Fehler, wenn die Tabelle den Status VALID hat. 11-38 Oracle8i Datenbankadministration Teil I
Tabellen-Speicherplatz überwachen UNUSED-Option Spalte als nicht-verwendet (UNUSED) markieren ALTER TABLE orders SET UNUSED COLUMN comments CASCADE CONSTRAINTS; UNUSED-Spalten löschen ALTER TABLE orders DROP UNUSED COLUMNS CHECKPOINT 1000; Löschen der Spalte fortsetzen ALTER TABLE orders DROP COLUMNS CONTINUE CHECKPOINT 1000; 11-24 Copyright Oracle Corporation, 1999. All rights reserved. Spalte auf UNUSED setzen Anstatt eine Spalte aus der Tabelle zu entfernen, können Sie die Spalte als nichtverwendet (UNUSED) markieren und später entfernen. Dies hat den Vorteil, ziemlich schnell zu sein, da die Daten nicht gelöscht werden und der Plattenspeicherplatz deshalb nicht freigegeben wird. Als UNUSED markierte Spalten können später aus der Tabelle gelöscht werden, wenn weniger Systemaktivität herrscht. UNUSED Spalten verhalten sich, als ob sie nicht mehr Teil der Tabelle wären. Abfragen können keine Daten von UNUSED Spalten sehen. Zusätzlich werden die Namen und Datentypen dieser Spalten nicht vom DESCRIBE-Befehl ausgegeben. Ein Benutzer kann eine neue Spalte mit dem gleichen Namen einfügen. Wenn Sie zwei Spalten aus der gleichen Tabelle löschen wollen, ist es sehr zu empfehlen, die Spalten zuerst als UNUSED zu markieren. Wenn Sie die zwei Spalten einzeln löschen, werden alle Zeilen der Tabelle zweimal aktualisiert; wenn Sie die Spalten zuerst als UNUSED markieren und dann die Spalten löschen, werden die Zeilen nur einmal aktualisiert. Oracle8i Datenbankadministration Teil I 11-39
Lektion 11: Tabellen verwalten Tabellen mit UNUSED Spalten identifizieren Mit der View DBA_UNUSED_COL_TABS können Sie Tabellen mit UNUSED Spalten abfragen. Es werden die Namen der Tabellen ermittelt, die UNUSED Spalten haben, und die Anzahl der UNUSED Spalten. Die folgende Abfrage zeigt, dass die Tabelle ORDERS des Eigentümers SUMMIT eine UNUSED Spalte besitzt: SQL> select * from dba_unused_col_tabs; OWNER TABLE_NAME COUNT --------------------------- --------------------------- --------- SUMMIT ORDERS 1 Einschränkungen beim Löschen einer Spalte Folgende Aktionen können Sie nicht durchführen: Spalte aus einer Objekttyp-Tabelle löschen Spalten aus verschachtelten Tabellen löschen alle Spalten einer Tabelle löschen Schlüsselspalte für Partitionen löschen Spalte aus Tabellen löschen, die SYS gehören Vaterschlüssel-Spalte löschen Spalte aus einer Index-Organized Tabelle löschen, wenn die Spalte der Primärschlüssel ist 11-40 Oracle8i Datenbankadministration Teil I
Tabellen-Information abrufen Tabellen-Information abrufen Tabellen-Informationen abrufen DBA_OBJECTS OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID CREATED DBA_SEGMENTS OWNER SEGMENT_NAME TABLESPACE_NAME HEADER_FILE HEADER_BLOCK DBA_TABLES OWNER TABLE_NAME PCT_FREE PCT_USED INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE CACHE BLOCKS EMPTY_BLOCKS CHAIN_CNT TEMPORARY DURATION 11-25 Copyright Oracle Corporation, 1999. All rights reserved. Data Dictionary-Informationen abrufen Informationen über Tabellen können aus dem Data Dictionary abgerufen werden. Mit der folgenden Abfrage ermitteln Sie die Datenobjektnummer und den Speicherort der Tabellen-Header für alle Tabellen des Benutzers SUMMIT: SQL> SELECT t.table_name, o.data_object_id, 2 s.header_file, s.header_block 3 FROM dba_tables t, dba_objects o, dba_segments s 4 WHERE t.owner=o.owner 5 AND t.table_name=o.object_name 6 AND t.owner=s.owner 7 AND t.table_name=s.segment_name 8 AND t.owner='summit'; Oracle8i Datenbankadministration Teil I 11-41
Lektion 11: Tabellen verwalten Data Dictionary-Informationen abrufen (Fortsetzung) TABLE_NAME DATA_OBJECT_ID HEADER_FILE HEADER_BLOCK ---------- -------------- ----------- ------------ CUSTOMER 12743 2 902 DEPARTMENT 12745 2 912 EMPLOYEE 12748 2 927 IMAGE 12751 2 942 INVENTORY 12753 2 952 ITEM 12755 2 962 LONG_TEXT 12758 2 977 ORDERS 12760 2 987 PRODUCT 12762 2 997 REGION 12765 2 1012 TITLE 12768 2 1027 WAREHOUSE 12770 2 1037 12 rows selected. 11-42 Oracle8i Datenbankadministration Teil I
Tabellen-Information abrufen Extent-Informationen abrufen DBA_EXTENTS OWNER SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS 11-26 Copyright Oracle Corporation, 1999. All rights reserved. Verteilung des zugewiesenen Speicherplatzes Die Anzahl der Extents, ihr Speicherort und ihre Größe können mit einer Abfrage von DBA_EXTENTS ermittelt werden. Das folgende Beispiel zeigt die Anzahl der Extents und der gesamten Blöcke, die in jeder Datei der Datenbank für eine Tabelle verwendet werden: SQL> SELECT file_id, COUNT(*) AS Extents, SUM(blocks) AS Blocks 2 FROM dba_extents 3 WHERE owner='summit' 4 AND segment_name='employee' 5 GROUP BY file_id; FILE_ID EXTENTS BLOCKS ------- ------- ------ 3 1 25 1 row selected. Oracle8i Datenbankadministration Teil I 11-43
Lektion 11: Tabellen verwalten Package DBMS_ROWID Häufig verwendete Funktionen: Funktionsname ROWID_CREATE ROWID_OBJECT ROWID_RELATIVE_FNO ROWID_BLOCK_NUMBER ROWID_ROW_NUMBER ROWID_TO_ABSOLUTE_FNO ROWID_TO_EXTENDED ROWID_TO_RESTRICTED Beschreibung ROWID aus einzelnen Komponenten erzeugen Objekt-Identifier für eine ROWID zurückgeben Relative Dateinummer für eine ROWID zurückgeben Blocknummer für eine ROWID zurückgeben Zeilennummer für eine ROWID zurückgeben Absolute Dateinummer für eine ROWID zurückgeben ROWID von eingeschränkt zu erweitert konvertieren ROWID von erweitert zu eingeschränkt konvertieren 11-27 Copyright Oracle Corporation, 1999. All rights reserved. ROWID-Informationen erhalten Der Oracle Server bietet das Package DBMS_ROWID, das vom Skript dbmsutil.sql erzeugt wird, das wiederum vom Skript catproc.sql aufgerufen wird. Das Package bietet einige Funktionen, die zur Konvertierung zwischen ROWID- Formaten und zur Übersetzung zwischen ROWID und seinen einzelnen Komponenten verwendet werden können. Einige Beispiele dafür werden in diesem Abschnitt gezeigt. ROWID-Komponenten erhalten Mit der folgenden Abfrage ermitteln Sie den physikalischen Speicherort der Zeilen einer Tabelle: SQL> SELECT id, ROWID, 2 DBMS_ROWID.ROWID_OBJECT(ROWID) AS OBJECT, 3 DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS "RELATIVE FILE", 4 DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS BLOCK 5 FROM summit.department; 11-44 Oracle8i Datenbankadministration Teil I
Tabellen-Information abrufen ROWID-Komponenten erhalten (Fortsetzung) ID ROWID OBJECT RELATIVE FILE BLOCK -- ------------------ --------- ------------- --------- 10 AAADHJAACAAAAORAAA 12745 2 913 31 AAADHJAACAAAAORAAB 12745 2 913 32 AAADHJAACAAAAORAAC 12745 2 913 33 AAADHJAACAAAAORAAD 12745 2 913 34 AAADHJAACAAAAORAAE 12745 2 913 35 AAADHJAACAAAAORAAF 12745 2 913 41 AAADHJAACAAAAORAAG 12745 2 913 42 AAADHJAACAAAAORAAH 12745 2 913 43 AAADHJAACAAAAORAAI 12745 2 913 44 AAADHJAACAAAAORAAJ 12745 2 913 45 AAADHJAACAAAAORAAK 12745 2 913 50 AAADHJAACAAAAORAAL 12745 2 913 12 rows selected. Absolute Dateinummer ermitteln Die folgende Abfrage ermittelt die absolute Dateinummer für Zeilen in SUMMIT.DEPARTMENT: SQL> SELECT id, ROWID, 2 DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO(ROWID,'SUMMIT','DEPARTMENT') AS "FILE" 3 FROM summit.department; ID ROWID FILE --------- ------------------ --------- 10 AAADHJAACAAAAORAAA 2 31 AAADHJAACAAAAORAAB 2 32 AAADHJAACAAAAORAAC 2 33 AAADHJAACAAAAORAAD 2 34 AAADHJAACAAAAORAAE 2 35 AAADHJAACAAAAORAAF 2 41 AAADHJAACAAAAORAAG 2 42 AAADHJAACAAAAORAAH 2 43 AAADHJAACAAAAORAAI 2 Oracle8i Datenbankadministration Teil I 11-45
Lektion 11: Tabellen verwalten Absolute Dateinummer ermitteln (Fortsetzung) 44 AAADHJAACAAAAORAAJ 2 45 AAADHJAACAAAAORAAK 2 50 AAADHJAACAAAAORAAL 2 12 rows selected. 11-46 Oracle8i Datenbankadministration Teil I
Zusammenfassung Zusammenfassung Zusammenfassung In dieser Lektion sollten Sie Folgendes gelernt haben: Tabelle anlegen mit geeigneten Speicherparametern und Parametern zur Block-Speicherausnutzung Tabellen-Speicherplatz überwachen Package DBMS_ROWID verwenden 11-28 Copyright Oracle Corporation, 1999. All rights reserved. Oracle8i Datenbankadministration Teil I 11-47
Lektion 11: Tabellen verwalten Kurzreferenz Kontext Initialisierungsparameter Dynamische Initialisierungsparameter Dynamische Performance-Views Data Dictionary-Views Befehle Prozeduren und Funktionen in Packages Referenz DB_BLOCK_SIZE DB_FILE_MULTIBLOCK_READ_COUNT keine DBA_TABLES DBA_SEGMENTS DBA_OBJECTS DBA_EXTENTS CREATE TABLE CREATE GLOBAL TEMPORARY TABLE ALTER TABLE... STORAGE ALTER TABLE... PCTFREE... PCTUSED ALTER TABLE... ALLOCATE EXTENT ALTER TABLE... DEALLOCATE UNUSED TRUNCATE TABLE DROP TABLE ALTER TABLE... DROP COLUMN ALTER TABLE... SET UNUSED COLUMN ALTER TABLE... DROP UNUSED COLUMNS ALTER TABLE... DROP COLUMNS CONTINUE DBMS_SPACE.UNUSED_SPACE DBMS_ROWID 11-48 Oracle8i Datenbankadministration Teil I