Database Benchmark

Werbung
Database Benchmark
Dozent: Prof. Bernhard Wyss
Student: Carla Santoro
Projektarbeit 2005/2006, Abteilung Informatik
Im Rahmen dieser Projektarbeit habe ich mich intensiv mit Linux-SUSE, Oracle 10g und
dem TPC-H Benchmark befasst. Dadurch konnte ich mich auf meinen bevorzugten Gebieten,
Linux-Systeme und Datenbanken, weiterentwickeln und darf auf eine interessante und lehrreiche Zeit zurückblicken.
Ich möchte mich an dieser Stelle bei Herrn Prof. Bernhard Wyss bedanken, dass ich diese
Projektarbeit durchführen durfte, er mich bei allen Problemen unterstütze und mir einiges über
Datenbanken beigebracht hat.
Inhaltsverzeichnis
1. Einleitung
1.1. Management Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Projektziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. Grundlagen
2.1. TPC-H Benchmark . . . . . . . . . . . . . .
2.1.1. Testumgebung . . . . . . . . . . . .
2.1.2. Queries . . . . . . . . . . . . . . . .
2.1.3. Ergebnis . . . . . . . . . . . . . . .
2.2. ORACLE-Datenbanksystem . . . . . . . . .
2.2.1. Aufbau . . . . . . . . . . . . . . . .
2.2.2. Werkzeuge . . . . . . . . . . . . . .
2.3. SUSE LINUX und Windows XP Client . . .
2.3.1. SUSE LINUX 10.0 . . . . . . . . . .
2.3.2. Windows XP Home Edition 2002 SP1
3. Einrichten der Testumgebung
3.1. Installation von SUSE . . . . . . . . . . .
3.2. Installation von Oracle . . . . . . . . . .
3.3. Datenbank erstellen . . . . . . . . . . . .
3.3.1. Benutzer und Tablespace anlegen
3.3.2. Tabellen erzeugen mit DBGEN .
3.3.3. Load . . . . . . . . . . . . . . .
3.3.4. Indizes erstellen . . . . . . . . .
4. Testen
4.1. Pro*C . . . . . . . . . . . . .
4.2. EmbeddedSQL . . . . . . . .
4.3. Programme erstellen . . . . .
4.4. Parameter erzeugen mit QGEN
4.5. Tests . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
2
.
.
.
.
.
.
.
.
.
.
3
3
4
5
5
6
6
11
13
13
13
.
.
.
.
.
.
.
14
14
16
18
25
28
30
31
.
.
.
.
.
32
32
37
38
38
39
5. Resultate
39
6. Tuning
6.1. Explain-Plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2. Statistik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3. Optimizer Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
40
44
46
7. Schluss
7.1. Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
48
Inhaltsverzeichnis
A. Resultate
A.1. Übersicht über alle Resultate . . . . . . . . . . . . . . . . . . . . . . . . . .
A.2. Einzelne Versionen mit Graphik . . . . . . . . . . . . . . . . . . . . . . . .
50
50
50
B. Datenbank
B.1. Tabellen und Indizes kreieren
B.2. Importieren der Daten . . . .
B.3. Logfiles der Tabellen . . . .
B.4. Parameter der Datenbank . .
.
.
.
.
51
51
51
51
51
C. Queries
C.1. Quellcode der Queries 1 bis 22 . . . . . . . . . . . . . . . . . . . . . . . . .
C.2. Buildprotokoll eines Programmes . . . . . . . . . . . . . . . . . . . . . . .
C.3. Einzelne Dateien mit Resultaten . . . . . . . . . . . . . . . . . . . . . . . .
52
52
52
52
D. Tuning
D.1. Explain-Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
53
E. TPC-H
E.1. Top Ten TPC-H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
E.2. Readme zu DBGEN/QGEN . . . . . . . . . . . . . . . . . . . . . . . . . .
E.3. Generierte Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
54
54
54
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1. Einleitung
1. Einleitung
Um die Leistung unterschiedlicher Systeme im Bezug auf Eigenschaften wie Anfragezeit und
Performance vergleichen zu können, müssen die zu vergleichenden Datenbank-Systeme standardisierten Tests unterzogen werden, was auch Benchmarking genannt wird.
Oracle ist ein mächtiges Datenbank-System und wird sehr oft eingesetzt. Aus diesem Grund
war es auch meine erste Wahl. Dasselbe gilt für den TPC-H Benchmark, er ist vor allem im
kaufmännischen Bereich von Bedeutung.
Da es beim Testen von Datenbank-Benchmarks vorallem um die Geschwindigkeit des Systems geht, habe ich mich entschieden, die Datenbank auf Linux aufzusetzen, und nicht auf
Windows. Zudem wollte ich mich stärke in das Thema Linux einarbeiten.
1
1. Einleitung
1.1. Management Summary
Aufgabenstellung:
Mit ausgesuchten Benchmarks (hauptsächlich Queries) sollen einige Datenbanksysteme getestet werden (ORACLE, PostgreSQL). Definition und Einrichten der Testumgebung, Benchmarks auswählen, Testwerkzeuge erstellen (CLI, OCI), Ablaufpläne verstehen und beeinflussen, Gezielt Hilfsstrukturen einsetzen.
Durchführung:
• Übersicht über die verschiedenen Benchmarks
• Auswahl und Anpassen einiger Benchmarks
• Aufsetzen der DB-Systeme auf einem System
• Einrichten der Datenbanken nach Vorgabe der Benchmarks
• Systemspezifische Tuningmassnahmen vergleichen
• Benchmarks durchführen und bewerten
Grenzen und Ausblick:
Benchmarks dienen dazu, die relative Performance von DB-Systemen abzuschätzen und Tuningmassnahmen einzusetzen zu bewerten, insbesondere
• erheben statistischer Grössen
• Ausführungspläne erstellen
• Zugriffsstrukturen erstellen
Resultate:
Die Resultate sollen interpretiert und ausgewertet werden.
1.2. Projektziel
Das Ziel der Projektarbeit musste ich im Verlauf der Arbeit anpassen. Da ich die Arbeit alleine
durchführte und mich auf einigermassen neues Territorium bewegte, wurde schnell klar, dass
nicht mehrere DB-Systeme getestet werden können. Das Aufsetzen von Oracle 10g auf LinuxSUSE 10.0 hat sehr viel Zeit beansprucht. Das Ziel wurde darauf reduziert, nur den TPC-H
Benchmark auf Oracle 10g zu testen.
2
2. Grundlagen
2. Grundlagen
In diesem Kapitel werde ich vor allem theoretisch auf den TPC-H Benchmark und das Oracle
Datenbank-System eingehen. Diejenigen, die sich bereits mit diesen Themen befasst haben,
können direkt zum Kapitel 2.3 gehen, wo ich auf die verwendete Hard- und Software eingehe.
2.1. TPC-H Benchmark
Ursprünglich kommt der Begriff Benchmark aus der Landvermessung und bezeichnet einen fixen Punkt in der Landschaft. Mit Benchmarking ist in diesem Zusammengang das Orientieren
an diesem Punkt gemeint. Im Falle der Datenbank-Systeme werden die Ergebnisse des Benchmarking eingesetzt, um die einzelnen Softwareprodukte in eine standartisierte Leistungsskala
einordnen zu können. Das Ergebnis des Benchmarking ergibt für jedes getestete Produkt einen
sogenannten Benchmark-Wert, der an einer imaginären Messlatte, z.B. dem Wert des auf dem
Markt führenden Softwareprodukts, gemessen werden kann. Je nach Höhe des ermittelten
Benchmark-Werts kann nun erkannt werden, ob das getestete Datenbank-System höher, niedriger oder gleichhoch wie die zu vergleichende Messlatte in die Leistungsskala eingeordnet
werden kann.
Das Transaction Performance Processing Council (TPC) hat es sich zur Aufgabe gemacht
verschiedene Benchmarks zur Verfügung zu stellen, um die Leistungen der unterschiedlichen
Datenbank-Systeme zu vergleichen. Die unterschiedlichen Benchmarks des TPC zielen auf
unterschiedliche Datenbank-Systeme ab und werden durch TPC- und einem einzelnen Buchstaben abgekürzt. Die Abkürzung TPC-C steht zum Beispiel für on-line transaction processing
benchmark, TPC-W steht für transactional web e-Commerce benchmrak. Die beiden Benchmarks TPC-A und TPC-B sind veraltet, sie wurden von der Technik eingeholt und sind nicht
mehr im Gebrauch.
Der TPC Benchmark H (TPC-H) [1] ist ein Entscheidungsunterstützungs-Benchmarksystem (decision support benchmarksystem). Er besteht aus einer Reihe von businessorientierten
ad-hoc Abfragen und parallelablaufenden Datenmanipulationen. Um auf veränderte Anforderungen im Datenbank-Bereich reagieren zu können, werden die Rahmenbedingungen des
Benchmarks an die laufende Entwicklung in der Industrie angepasst und weiterentwickelt, das
eigentliche Schema bleibt aber bestehen. Die aktuelle Versionsnummer des TPC-H ist 2.3.0.
Die Abfragen und die in der Datenbank enthaltenen Daten wurden vom TPC so ausgewählt,
dass sie eine möglichst breite branchenübergreifende Bedeutung haben. Es werden Abfragen
mit einem hohen Komplexitätsgrad ausgeführt und dadurch versucht Antworten auf kritische
Geschäftsfragen zu geben.
3
2. Grundlagen
2.1.1. Testumgebung
Die Datenbasis des Benchmarks besteht aus 8 eigenständigen Tabellen von zum Teil sehr
unterschiedlicher Grösse.
Abbildung 1: TPC-H Schema
Bei den kursivgedruckten Attributen handelt es sich um die Primärschlüssel der jeweiligen
Tabelle. Die Pfeilrichtung gibt die jeweilige Fremdschlüsselbeziehung an. Die Zahl unter dem
Tabellennamen gibt die Kardinalität (die Anzahl Zeilen) der jeweiligen Tabelle an. Die Kardinalitäten, die noch mit dem Faktor SF multipliziert werden, hängen vom Scaling Factor (dem
Skalierungswert) des Benchmarks ab. Dieser Wert bestimmt die Grösse der zu Grunde liebenden Datenbasis. Er kann die folgenden Werte annehmen:
SF = 1, 10, 30, 100, 300, 1000, 3000, 10000, 30000, 100000.
Bei einem SF = 1 beträgt die geschätzte Grösse der Datenbasis etwa 1 GB. Um Datenbanken mit einem grösseren Volumen zu simulieren, kann der SF entsprechend grösser gewählt
werden, und ergibt dadurch entsprechend eine Datenbasis von:
Ca. 10GB, 30GB, 100GB, usw...
Die Datenbestände müssen mit dem DBGEN Programm erstellt werden, welches von der
TCP-Organisation zur Verfügung gestellt wird.
Das Benchmarkschema von TPC-H bildet die Geschäftsprozesse eines imaginären Handelsunternehmen ab, das Waren (Part) von seinen Lieferanten (Supplier) bezieht. PartSupp gibt an
welche Waren von welchem Lieferanten geliefert werden können, so wie deren Anzahl und
Preis. Die Kunden (Cusomer) können Bestellungen (Order) aufgeben, welche wiederum aus
mehreren Bestellposten (Lineitem) bestehen können. Sowohl Kunden als auch Lieferanten
können unterschiedlicher Nationalität (Nation) sein und somit über die 5 unterschiedlichen
Kontinente (Region) aufgeteilt.
4
2. Grundlagen
2.1.2. Queries
Auf dieser Datenbasis werden 22 Decision-Support-Anfragen ausgeführt, die jeweils unterschiedliche geschäftsbezogene Anfragen für das zugrundeliegende Handelsunternehmen darstellen. Dies dient dazu, den betriebswirtschaftlichen Kontext zu verdeutlichen, in dessen Zusammenhang die Abfrage für ein beliebiges Unternehmen benutzt werden könnte.
Über die 22 Anfragen hinaus gibt es noch zwei Refresh-Funktionen. Diese beiden Funktionen fügen durch INSERT-Befehle Daten dem Datenbestand hinzu, bzw. nehmen mittels
DELETE-Befehlen Daten aus dem Datenbestand heraus. Es handelt sich bei all diesen Anfragen um sogenannte ad-hoc Anfragen. Es wird also davon ausgegangen, dass der Benutzer
nicht weiss, welche Anfragen an das Datenbanksystem gestellt werden und wie die Daten in
der Datenbank abgespeichert sind. Die Anfragen dürfen also nicht mit Hilfe von Kenntnissen
über den Datenbestand oder die Anfragereihenfolge optimiert werden.
2.1.3. Ergebnis
TPC-H definiert drei grundlegende Metriken, die dazu dienen, die getesteten Datenbanksysteme in 3 unterschiedlichen Bereichen in eine Leistungsskala einordnen zu können.
• Eine Anfragen-pro-Stunde (query-per-hour) Metrik ([email protected]). Sie gibt an, wie viele Anfragen einer bestimmten Grösse (@Size) pro Stunde erfolgreich verarbeitet werden
können.
• Eine Preis-Leistungs (price-performance) Metrik ($/[email protected] mit $ = Gesamtpreis
des Systems). Sie gibt das Preis-Leistungsverhältnis des Datenbanksystems an.
• Eine Systemverfügbarkeits (systems-availability-date) Metrik. Sie gibt an seit wann alle
am Test beteiligten Systemkomponenten auf dem Markt frei verfügbar sind.
Einen Auszug aus den Top Ten TPC-H by Price/Performane finden Sie im Anhang E. Für
weiterführende Informationen besuchen Sie die Homepage http://www.tpc.org.
5
2. Grundlagen
2.2. ORACLE-Datenbanksystem
Die folgende Zusammenfassung basiert auf dem Oracle Database 10g DBA-Handbuch [3].
Das Oracle-Datenbanksystem ist ein relationales Datenbank Management System, das sich
logisch in zwei Bereiche unterteilen lässt. Einerseits die eigentlichen Datenbankinstanzen und
andererseits der Oracle Database Server.
Während die Oracle-Datenbank auf Server-Laufwerken gespeichert ist, existiert die OracleInstanz im Arbeitsspeicher des Servers. Eine Oracle-Instanz besteht aus einem grossen Speicherblock, der in einem Bereich namens System Global Area (SGA) reserviert ist, und zahlreichen
Hintergrundprozessen, die zwischen der SGA und den Datenbankdateien auf den Laufwerken
interagieren.
Die Datendateien in einer Oracle-Datenbank sind in einem oder mehreren Tablespaces gruppiert. Innerhalb der Tablespaces, die zusammen die logische Datenbankstruktur aus Tabellen
und Indizies bilden, gibt es Segmente. Und diese Segmente sind nochmals in Extents und
Blöcke unterteilt.
2.2.1. Aufbau
Tablespaces:
Ein Oracle-Tablespace besteht aus einer oder mehreren Datendateien; eine Datendatei kann
nur zu einem einzigen Tablespace gehören. Beim Installieren von Oracle 10g werden mindestens zwei Tablespaces eingerichtet: Der SYSTEM- und der SYSAUX-Tablespace. Mit Bigfiles
(bis zu 1 Mio. Terabytes) wird die Tablespace-Verwaltung für den Datenbank-Administrator
(DBA) vollkommen transparent. Mit anderen Worten kann der DBA den Tablespace als Einheit verwalten, ohne sich um die Grösse und Struktur der darunter liegenden Datendateien
kümmern zu müssen. Noch einfacher ist die Verwaltung der Datendateien in den Tablespaces
mit den Oracle Managed Files (OMF). Mit OMF definiert der DBA einen oder mehrere Standorte im Dateisystem, an denen Datendateien, Steuerdatein und Redo Log-Dateien liegen sollen. Oracle übernimmt automatisch die Benennung und das Management dieser Dateien.
Bei lokal verwalteten Tablespaces unterhält Oracle für jede Datendatei im Tablespace ein
Bitmap, das die Verfügbarkeit des Speicherplatzes protokolliert. Nur die Platzkontingente werden weiterhin im Data Dictionary verwaltet, was potenzielle Engpässe bei Data DictionaryDateien drastisch reduziert.
Blöcke:
Ein Datenblock ist die kleinste Speichereinheit in der Oracle-Datenbank. Die Grösse eines
Blocks ist eine spezifische Anzahl Speicherbytes innerhalb eines Tablespaces in der Datenbank.
6
2. Grundlagen
Extents:
Ein Extent ist die nächste Ebene der logischen Gruppierung in der Datenbank. Ein Extent
besteht aus einem oder mehreren Datenbankblöcken. Vergrössert man ein Datenbankobjekt,
wird der zusätzliche Speicherplatz für das Objekt als Extent reserviert.
Segmente:
Die nachfolgende Ebene der logischen Gruppierung ist das Segment. Es ist eine Gruppe von
Extents mit einem Datenbankobjekt, das als Einheit behandelt wird. Bsp. Tabelle oder Index. Es ist die kleinste Speichereinheit, mit der ein Endanwender umgeht. In einer OracleDatenbank gibt es vier Segmenttypen: Datensegmente, Indexsegmente, temporäre Segmente
und Rollback-Segmente.
Tabellen:
In einer relationalen Datenbank werden alle Daten in zweidimensionale Tabellen abgespeichert, die sich aus Zeilen und Spalten zusammen setzen. In der Oracle-Datenbank gibt es
verschiedene Tabellentypen die man je nach Applikation auswählen kann.
Relationale Tabellen sind unsortiert, das heisst, die Zeilen in der Tabelle sind nicht in einer
bestimmten Abfolge hinterlegt. Jede Zeile einer Tabelle umfasst eine oder mehrere Spalten.
Eine Spalte kann einen benutzerdefinierten Objekttyp, eine verschachtelte Tabelle oder ein
VARRAY enthalten. Zusätzlich lässt sich eine Tabelle als Objekttabelle definieren.
Temporäre Tabellen sind hinsichtlich der Daten temporär, die in der Tabelle gespeichert
sind, nicht im Bezug auf die Tabellendefinition. In einer temporären Tabelle gibt es unterschiedliche Typen von temporären Daten: temporär für die Dauer der Transaktion, und temporär für die Dauer der Sitzung.
Indexorganisierte Tabellen haben den Vorteil, dass durch das Anlegen eines Index eine bestimmte Zeile innerhalb einer Tabelle leichter aufzufinden ist. Damit generiert man jedoch
einen kleinen Overhead, da die Datenbank neben den Datenzeilen auch die Indexeinträge für
die Tabelle verwalten muss.
Objekttabellen besitzen Zeilen, die ihrerseits Objekte sind, oder Instanzen von Typdefinitionen. Zeilen in einer Objekttabelle lassen sich über eine Objekt-ID referenzieren, im Gegensatz
zu einem Primärschlüssel in einer relationalen oder regulären Tabelle. Dennoch können Objekttabellen, genau wie relationale Tabellen, sowohl primäre als auch eindeutige Schlüssel
besitzen.
7
2. Grundlagen
Externe Tabellen erlauben dem Benutzer den Zugriff auf eine Datenquelle, wie eine Textdatei, als handle es sich um eine Tabelle in der Datenbank. Die Metadaten für die Tabelle
sind im Oracle Data Dictionary, die Inhalte der Tabelle hingegen sind extern gespeichert.
Auf externe Tabellen lassen sich keine Indizes anlege und keine inserts, updates oder deletes ausführen. Vorteile sind dagegen, dass sich zum Beispiel eine native Datenbanktabelle in
eine Data Warehouse-Umgebung laden lässt.
Geclusterte Tabellen sind eine Möglichkeit zur Performanceverbesserung wenn häufig auf
eine oder zwei Tabellen zugegriffen wird. Ein spezieller Typ für geclusterte Tabellen ist ein
Hash-Cluster, welcher zum Abholen und Speichern der Daten in einer Tabelle eine HashingFunktion nutzt. Ein Hash-Cluster kann jedoch kein Cluster-Index verwenden.
Neu bei Oracle 10g sind die sortierten Hash-Cluster. Diese ermöglichen zusätzlich, dass die
Zeilen in der Tabelle über eine oder mehrere Spalten in aufsteigender Reihenfolge gespeichert
werden. Damit lassen sich die Daten jener Applikationen wesentlich schneller verarbeiten, die
nach dem FIFO-Prinzip arbeiten.
Grosse Tabellen lassen sich durch Partitionieren einfacher verwalten. Oracle empfiehlt, alle
Tabellen grösser als 2 GB zu partitionieren.
Constraints:
Ein Oracle-Contraint besteht aus einer oder mehreren Regeln, die sich zur Durchsetzung der
Geschäftsregeln für eine oder mehrere Spalten definieren lassen. So kann ein Constraint beispielsweise die Geschäftsregel erzwingen, dass das Anfangsgehalt eines Angestellten mindestens CHF 25’000 beträgt. Auf Spalten lassen sich sechs Typen von Datenintegritätsregeln
anwenden:
• NULL-Regel -> NOT NULL
• eindeutige Spaltenwerte -> UNIQUE
• Primärschlüsselwerte -> PRIMARY KEY
• referenzielle Integirtätswerte -> FOREIGN KEY
• komplexe In-Line-Integrität -> CHECK
• Trigger-basierte Integrität -> mit create trigger-Befehl und PL/SQL-Block (Geschäftsregel)
8
2. Grundlagen
Indizes:
Ein Oracle-Index ermöglicht einen schnelleren Zugriff auf Zeilen in einer Tabelle, wenn nur
ein kleines Subset der Zeile aus der Tabelle abzuholen ist. Indizes legt man auf einzelne oder
mehrere Spalten an. Der eindeutige Index beschleunigt nicht nur die Suchgeschwindigkeit,
sondern erzwingt auf die indizierte Spalte zusätzlich einen UNIQUE- oder PrimärschlüsselConstraint. Die Indexeinträge werden in dem Moment akutalisiert, wo man Inhalte einfügt,
aktualisiert oder löscht. Wird die Tabelle gelöscht, werden automatisch alle Indizes gelöscht.
Views:
Mit Hilfe von Views sehen Anwender eine aufbereitete Darstellung der Daten in einer Tabelle oder von Joins zwischen mehreren Tabellen. Ein View ist auch eine gespeicherte Abfrage,
die Abfragedetails bleiben aber dem Benutzer einer View verborgen. Eine reguläre View speichert keine Daten, sondern nur die Definition, und die darunter liegende Abfrage wird bei
jedem Zugriff auf die View ausgeführt. Die materialisierte View speichert neben der Abfrage
auch die Abfrageergebnisse, was unter anderem die Verarbeitung beschleunigt. Objekt-Views
verbergen die Details der darunter liegenden Tabellen-Joins. Zudem ermöglichen sie die objektorientierte Verarbeitung in Datenbanken, in denen die darunter liegenden Tabellen noch
im relationalen Format vorliegen.
Physische Speicherstrukturen in Oracle:
Die Oracle-Datenbank nutzt zum Halten und Verwalten der Benutzertransaktionen auf dem
Laufwerk zahlreiche physische Speicherstrukturen. Datendateien, Redo Log-Dateien und archivierte Redo Log-Dateien halten aktuelle Benutzerdaten vor. Steuerdateien verwalten den
Status der Datenbankobjekte. Textbasierte Alert- und Trace-Dateien enthalten Logging-Informationen über Routine-Events und Fehlerbedingungen in der Datenbank.
Oracle-Arbeitsspeicherstrukturen:
Der für eine Oracle-Instanz reservierte Datenbereich heisst System Global Area (SGA) und
liegt im Arbeitsspeicher des Servers. Darin enthalten sind:
• der Programmcode für Oracle selbst
• Sitzungsinformationen
• individuelle Prozesse für die Datenbank
• Sitzungsinformationen, die von allen Prozessen benötigt werden
• SQL-Anweisungen für Benutzer
• das Data Dictionary
• gecachte Informationen wie Datenblöcke von Datenbanksegmenten
• Informationen über beendete Transaktionen in der Datenbank
9
2. Grundlagen
Die Programme liegen im Software-Codebereich. Zusätzlich gibt es die Program Global
Area (PGA), die privat für jeden Server- und Hintergrundprozess ist. Für jeden Prozess wird
eine PGA reserviert. Die Konfiguration der PGA hängt von der Verbindungskonfiguration der
Oracle-Datebank ab: entweder Shared Server oder dediziert.
In einer Shared Server-Konfiguration nutzen mehrere Benutzer eine Verbindung zur Datenbank, was zwar die Belastung des Arbeitsspeichers auf dem Server minimiert, aber die
Antwortzeiten für Benutzeranforderungen verlängern kann. In Die Sitzungsinformationen für
den Benutzer enthält nicht die PGA, sondern die SGA. In einer dedizierten Serverumgebung
erhält jeder Benutzerprozess eine eigene Verbindung zur Datenbank; die PGA enthält die Sitzungsinformationen.
Hintergrundprozesse:
Beim Start einer Oracle-Instanz starten auch zahlreiche Hintergrundprozesse. Zwei Beispiele
sind SMON und PMON.
SMON ist der System Monitor-Prozess. Im Falle eines Systemzusammenbruchs oder Instanzfehlers führt der SMON-Prozess ein Crash-Recovery aus. Dazu werden die Einträge in
den Online Redo Log-Dateien auf die Datendateien angewendet. Zusätzlich werden die temporären Segmente in allen Tablespaces gelöscht. Falls eine Benutzersitzung oder ein Benutzerprozess scheitert, übernimmt der Prozessmonitor (PMON) die Aufräumarbeiten. Er räumt
den Datenbank-Puffercache und alle anderen Ressourcen auf, die von der Benutzersitzung
verwendet wurden.
Backup und Recovery:
Oracle unterstützt verschiedene Formen von Backups und Recoveries. Manche Varianten lassen sich über Benutzerebenen verwalten, wie Export und Import, doch die Mehrzahl sind strikt
dem DBA vorbehalten. Dazu zählen Online- und Offline-Backups, der Einsatz von Betriebssystembefehlen oder das Dienstprogramm RMAN.
Eine Möglichkeit für ein physisches Backup der Datenbank ist das Ausführen eines OfflineBackups. Dazu wird die Datenbank heruntergefahren und alle datenbankbezogenen Dateien
werden aneinen zweiten Standort kopiert. Befindet sich die Datenbank im archivelog-Modus,
lässt sich die Datenbank mit Online-Backups sichern. Die Datenbank kann offen bleiben und
ist damit während des Backup-Prozesses für alle Benutzer verfügbar. Zuerst überführt man
den Tablespace in den Backup-Status, sicher die Datendateien im Tablespace mit Betriebssystembefehlen und setzt den Tablespace anschliessend wieder in den normalen Status zurück.
10
2. Grundlagen
Sicherheitsoptionen:
Objektberechtigungen steuern den Zugriff auf Daten und andere Objekte. Mit Systemberechtigungen steuert man den Zugriff auf Aktionen in der Datenbank.
Um den Zugriff auf die Objekte in der Datenbank durch Benutzer zu prüfen, lässt sich mit
Hilfe des audit-Befehls auf spezifische Objekte oder Aktionen ein Audit-Trail oder Prüfpfad
einrichten. Dabei kann man sowohl die SQL-Anweisungen als auch die Zugriffe auf ein
bestimmtes Datenbankobjekt überwachen. Das übermässige Auditing von Datenbankobjekten kann sich jedoch auf die Performance auswirken. Deshalb sollte man mit einem BasisAuditing auf die zentralen Berechtigungen und Objekte beginnen und das Auditing erst erweitern, wenn mit dem Basis-Auditing potenzielle Problemfelder aufgedeckt wurden.
Die Virtual Private Database verbindet eine hoch auflösende Zugriffssteuerung mit einem
sicheren Applikationskontext. Die Sicherheitspolitik ist an die Daten und nicht an die Applikation gebunden. Dadurch wird sichergestellt, dass die Sicherheitsregeln unabhängig vom
Datenzugriff erzwungen werden.
Die Oracle Label Security bietet eine vordefinierte Lösung, um den Zugriff auf die Zeilen
in allen Tabellen einzuschränken. Dies erlaubt beispielsweise dem DBA eines Application
Service provider, nur eine Instanz mit zulässigen Applikationen einzurichten, und mit Hilfe
der Label Security in allen Tabellen die Zeilen einzuschränken, die den einzelnen Accounts
einer Firma als zulässige Informationen zur Verfügung stehen.
2.2.2. Werkzeuge
Oracle Enterprise Manager:
Der Oracle Enterprise Manager (OEM) ist ein Toolset für die umfassende Verwaltung aller Komponenten einer Oracle-Infrastruktur, inklusive der Oracle-Datenbankinstanzen, Oracle
Applikation Server und Webserver. Der OEM ist via Netscape oder Internet Explorer voll
webfähig. Damit lässt sich die OEM-Konsole von jeder Plattform starten, die Netscape oder
den IE unterstützt. OEM bietet zudem den Vorteil, dass sich E-Mail-Benachrichtigungen für
kritische Bedingungen an den SYSMAN oder andere E-Mail-Accounts versenden lassen.
11
2. Grundlagen
Die folgende Liste gibt einen Überblick über verschiedene Werkzeuge, die Oracle anbietet
um mit der Datenbank zu arbeiten:
• Oracle Universal Installer (OUI)
• Database Configuration Assistant (DBCA)
• Administration Assistant for Windows
• Database Upgrade Assistant
• Oracle Net Manager
• Ultra Search und Ultra Search Administration Tool
• Oracle Enterprise Manager 10g Database Control
• SQL*Plus und iSQL*Plus
Mit Hilfe des Oracle Universal Installers kann das ganze Oracle-System, sowie Zusatzsoftware, installiert und deinstalliert werden. Der Database Configuration Assistant ist das
Werkzeug zum Erstellen, Löschen und Modifizieren der eigentlichen Datenbanken. Eine Datenbank kann auch manuell, ohne DBCA, erstellt werden. Der Oracle Administartion Assistant
for Windows dient dazu, administrative Aufgaben mit Hilfe eines grafischen Benutzerinterfaces im Windows Stil zu erleichtern. Darüber hinaus bietet er die Möglichkeit verschiedene
Parameter des Oracle-Systems zu modifizieren.
Oracle Net Manager:
Oracle Net dient als Schnittstelle zwischen einer Clientanwendung und einem Oracle-Datenbankserver und ist für den Verbindungsaufbau und die Überwachung einer Netzwerksession,
genauso wie für den Nachrichtenaustausch zwischen den beiden Instanzen verantwortlich.
Oracle Net muss auf jedem Client und Server im betreffenden Netzwerk installiert sein. Der
Oracle Net Manager kann dann dazu eingesetzt werden die jeweiligen Computer zu konfigurieren. Dies kann sowohl vom Client wie auch vom Server aus geschehen. Der Oracle Net
Manager ist auch im Oracle Enterprise Manager integriert und kann durch diesen aufgerufen
werden.
12
2. Grundlagen
2.3. SUSE LINUX und Windows XP Client
Der Oracle-Datenbank-Server wurde auf SUSE LINUX installiert. Der Oracle-DatenbankClient wurde auf Windows XP installiert.
2.3.1. SUSE LINUX 10.0
Hardware:
• Intel Pentium IV mit 3 GHz
• 1 GB RAM
• 59 GB Festplatte
Software:
• SUSE LINUX 10.0
• Oracle Database 10 g
2.3.2. Windows XP Home Edition 2002 SP1
Hardware:
• Intel Pentium IV mit 2 GHz
• 256 MB RAM
• 40 GB Festplatte
Software:
• Windows XP Home Edition 2002 SP1
• Oracle Databse Client
• Microsoft Visual Studio .NET 2003
13
3. Einrichten der Testumgebung
3. Einrichten der Testumgebung
Bevor irgendetwas getestet werden kann, muss einige Vorarbeit geleistet werden. Dieses Kapitel beschreibt zunächst die Installation des SUSE 10.0 Linux Betriebssystem. Danach wird das
Oracle 10g Datenbanksystem auf SUSE 10.0 installiert und zum Schluss wird die Datenbank
erstellt.
3.1. Installation von SUSE
Da Oracle 10g nur SUSE 9 unterstützt, habe ich zuerst versucht SUSE 9 zu installieren. Doch
die Fehlermeldung, es könne keine Festplatte gefunden werden hat mich dazu veranlasst SUSE 10.0 zu installieren. Mittlerweile gibt es SUSE 10.1 Final und SUSE 10.2. Alpha-Version.
Die Installation des SUSE Linux Systems wird durch den Systemassistenten YaST ausgeführt. Nach einlegen der Installations-CD muss man den Computer neu starten und folgt
den Anweisungen. Genaue Installations-Handbücher findet man auf der Homepage von Novell http://www.novell.com.
An dieser Stelle sei erwähnt, dass YaST “stärker“ ist, als die Konsole. Das heisst, wenn
Änderungen am System über die Konsole gemacht werden, kann es sein, dass YaST diese
beim nächsten Neustart überschreibt.
Als Oberfläche kann man zwischen KDE Desktop und GNOME Desktop wählen. Ich habe
mich für KDE entschieden.
Das Installieren und Löschen von Software erfolgt über den YaST Package Manager. Diesen wird man am Anfang öfter brauchen, denn um Oracle 10g zu installieren, muss man zuvor
noch einige Pakete für SUSE installieren. Das wird im nächsten Unterkapitel beschrieben.
Abbildung 2: Yast Package Manager
14
3. Einrichten der Testumgebung
Um später vom Windows Client auf den SUSE-Rechner zugreifen zu können, muss ein
Programm für die Datenübertragung installiert werden. Neben Samba (bestehend aus einer
Sammlung von Tools mit denen UNIX-Rechner Drucker und Dateien für Windowsrechner
über das Netzwerk freibgeben kann) gibt es das FTP (File Transfer Protocol), welches auf
SUSE 10.0 leider nicht läuft. Dafür geht es mit SFTP (Simple File Transfer Protocol) umso
einfacher. Samba habe ich installiert, um auf dem Drucker der Schule drucken zu können. Ein
Drucker kann auf Linux auch mit ”CUPS”(= Common UNIX Printing System) eingerichtet
und verwaltet werden. Gehen Sie dazu auf die Homepage http://www.cups.org.
Während der Installation wird man aufgefordert, das root-Passwort zu setzen. Hier sei angemerkt, dass man bei Linux-Systemen allgemein nur als root angemeldet sein sollte, wenn
es unbedingt nötig ist. Ist das Passwort gesetzt, kommt man zu den Netzwerk-Einstellungen.
Die Adresskonfiguration erfolgt automatisch mit DHCP. Auch hier gibt es bei der Installation
von Oracle 10g einige Probleme, die im nächsten Unterkapitel beschrieben werden.
Arbeitet man in einem Netzwerk, sollte man nicht vergessen, die Firewall zu aktivieren.
Um vom Windows-Client auf den SUSE-Rechner zugreifen zu können, habe ich den Port
1521 (OracleNet) geöffnet.
Zu guter Letzt erstellen wir einen separaten User für die Arbeit mit der Oracle Datenbank.
Ich habe meinen User “oracle“ genannt und mit dem Passwort “test“ versehen.
15
3. Einrichten der Testumgebung
3.2. Installation von Oracle
Für die Installation von Oracle 10g habe ich das Online-Handbuch “Oracle Database Quick
Installation Guide“ [4] verwendet. Nehmen Sie bitte dieses Handbuch zur Unterstützung, ich
werde in diesem Kapitel hauptsächlich auf die Probleme die auftreten können eingehen.
Zuerst muss man sich in einer Konsole als root anmelden um einige Hardware-Anforderungen zu überprüfen. Es muss auf jeden fall genügend Speicherplatz vorhanden sein. Genaue
Angaben dazu findet man im genannten Handbuch [4].
Oracle 10g unterstütz die Linux-Distributionen RedHat und SUSE, aber bei SUSE nur die
Version 9.0. Ich musste also einen kleinen Trick anwenden und habe die Datei /etc/SUSErelease so abgeändert, dass jetzt “SUSE LINUX 9.0“ darin steht. Das System denkt nun, es
sei Version 9.0 obwohl es Version 10.0 ist. Die unterstützten Kernel-Versionen sind von 2.6.5
bis 7.97. Mein System hat die Kernel-Version 2.6.13.
Bevor man nun mit der Installation beginnen kann, müssen einige zusätzlichen Pakete installiert werden. Welche das genau sind, inklusive Versionsnummer, findet man im Handbuch
[4].
Beim Erstellen des oracle-Benutzers sollte man nicht vergessen, ihm ein home-Verzeichnis
zu geben. Sonst könnte bei der späteren Installation ein seltsamer Fehler (”DISPLAY”) auftreten, aus dem nicht ersichtlich ist, dass es um das home-Verzeichnis geht.
Der nächste spannende Punkt sind die Kernel Parameter. Die Änderungen sind in der Datei
/etc/sysctl.conf vorzunehmen. Hier kommt nun das Problem, dass YaST gewisse Änderungen
überschreibt. Es werden zumindest nicht alle Änderungen auf Anhieb angenommen. Es wird
empfohlen, das Paket “orarun“ zu installieren. Welches dann ein weiteres Paket namens “libaio“
benötigt. Mit “orarun“ werden die meisten Änderungen dann angenommen. Genaue Angaben
zum Vorgehen mit “orarun’”findet man im Handbuch “Oracle 10g R1 (10.1.0.3) on SUSE LINUX Enterprise Server 9“ [5]. Die einzige Änderung die jetzt noch nicht akzeptiert wird, ist
”net.ipv4.ip local port range”. Als Nothilfe kann man vor jedem Versuch der Intallation von
Oracle in der Konsole den Befehl “echo 1024 65000 > /proc/sys/net/ipv4/ip local port range“
eingeben.
Wenn alles gemäss Handbuch [4] vorbereitet ist, kann man mit der Installation beginnen.
Das Standardverzeichnis ist /home/oracle/oracle/product/10.2.0/db 1
16
3. Einrichten der Testumgebung
Legt man die Oracle 10g CD ein um die Installation zu starten, werden zunächst die Anforderungen geprüft. Ich hatte an dieser Stelle einen Fehler mit der anschliessenden Empfehlung: “Oracle unterstützt Installationen in Systemen mit DHCP-zugewiesenen öffentlichen
IP-Adressen. Die primäre Netzwerkschnittstelle in dem System muss jedoch mit einer statischen IP-Adresse konfiguriert werden, damit die Oracle-Software richtig ausgeführt werden
kann.“ Ich habe meinen Rechner dann so konfiguriert, doch der Fehler blieb weiterhin bestehen. Ich habe die Installation dann trotzdem ausgeführt. Das heisst, dieser Fehler kann
ignoriert werden.
Abbildung 3: Oracle Universal Installer
Als nächstes muss der Oracle Client auf Windows installiert werden. Das geht problemlos.
Man wählt einfach die Installation als “Administrator“ aus und folgt den Anweisungen.
Sobald die Datenbank auf dem SUSE-Rechner erstellt ist, können praktisch alle Arbeiten
über die Enterprise Manager Konsole vom Client aus durchgeführt werden.
17
3. Einrichten der Testumgebung
3.3. Datenbank erstellen
Der Installationsort von Oracle auf meinem SUSE-Rechner ist;
/home/oracle/oracle/product/10.2.0/db 16 (db 16 weil 15 Versuche Fehl schlugen)
• unter db 16 welchseln wir ins Verzeichnis /bin und setzten den Pfad und das Home;
• geben Sie “. oraenv“ ein, dann fragt er;
• “ORACLE SID = [oracle] ?“ worauf Sie “test“ eingeben (oder das Passwort, welches
Sie gesetzt haben).
• Nun können Sie die Datenbank starten indem Sie ”dbcaëingeben und mit Return bestätigen.
Es erscheint folgendes Bild
Abbildung 4: Datenbank Konfigurationsassistent
18
3. Einrichten der Testumgebung
Abbildung 5: Schritt 1
Abbildung 6: Schritt 2
Wir kreieren eine benutzerdefinierte Datenbank.
19
3. Einrichten der Testumgebung
Abbildung 7: Schritt 3
Der Name der Datenbank ist hier ”test”, die SID ist automatisch auch ”test”.
Abbildung 8: Schritt 4
20
3. Einrichten der Testumgebung
Abbildung 9: Schritt 5
Abbildung 10: Schritt 6
21
3. Einrichten der Testumgebung
Abbildung 11: Schritt 7
Abbildung 12: Schritt 8
22
3. Einrichten der Testumgebung
Abbildung 13: Schritt 9
Abbildung 14: Schritt 10
23
3. Einrichten der Testumgebung
Abbildung 15: Schritt 11
Abbildung 16: Schritt 12
24
3. Einrichten der Testumgebung
3.3.1. Benutzer und Tablespace anlegen
Den Benutzer und die Tablespace anlegen kann man bequem über die Oracle Enterprise
Manager-Konsole auf dem Windows Client. Möchte man sich nun über die Manager-Konsole
mit dem Server (SUSE-Rechner) verbinden, muss man den Listener auf dem Linux-Rechner
starten:
• ../oracle/product/10.2.0/db 16/bin (enter)
• . oraenv (enter)
• test (enter)
• sqlplus (enter)
• / as sysdba (enter)
• SQL> startup (enter)
“Datenbank geöffnet“
• exit (enter)
• ../oracle/product/10.2.0/db 16/bin> lsnrctl start (enter)
Um überhaupt mit der Oracle Enterprise Manager-Konsole arbeiten zu können, gehen Sie
ins Verzeichnis;
D:\oracle\product\10.2.0\client 1\BIN
und erstellen eine Verknüpfung von “oemapp.bat“ und schreiben bei den Eigenschaften
“console“ dahinter, so wie auf folgendem Bild
Abbildung 17: Eigenschaften oemapp.bat
25
3. Einrichten der Testumgebung
Zuerst muss man den Tablespace kreieren. In der Oracle Enterprise Manager-Konsole klickt
man auf “Speicher“, “Tablespace“ und rechtsklick auf “USERS“, dann auf “ ähnliche erstellen“. Der Name ist TPCH (TPCH1.dbf) und die Grösse 500MB.
Abbildung 18: Oracle Enterprise Manager-Konsole
Die wichtigsten Benutzer sind SYS und SYSTEM. Nun müssen wir noch einen separaten Benutzer kreieren. Das kann man auch über die Enterprise Manager-Konsole erledigen,
indem man auf Schema klickt und dann auf Erstellen (man kann auch über “Sicherheit”, ”Benutzer”gehen).
Ich habe den Benutzer ”tpchtest”wie folgt erstellt:
Abbildung 19: Benutzer - Allgemein
26
3. Einrichten der Testumgebung
Abbildung 20: Benutzer - Rolle
Abbildung 21: Benutzer - Quota
27
3. Einrichten der Testumgebung
3.3.2. Tabellen erzeugen mit DBGEN
Um den TPC-H Benchmark zu testen, muss man die Datenbank nach den Vorgaben des ”TPC
BENCHMARK H (Decision Support) Standard Specification Revision 2.3.0“ erstellen. Auf
der Homepage http://www.tcp.org unter TPC H kann man das Programm DBGEN
herunter laden. Das Programm erstellt die Tabellen. Meine Version ist; tpch 20051026.
Es ist einfacher das Programm auf Linux zu starten, die Dateien dann auf den WindowsClient zu kopieren und von dort mit der Manager-Konsole zu laden. Das DBGEN-Programm
direkt vom Windows-Client zu starten, kann zu grösseren Problemen führen, da es ursprünglich
für Linux-Betriebssysteme geschrieben wurde.
Ich habe also DBGEN auf dem SUSE-Rechner installiert. Gemäss dem ”Readme“ von DBGEN muss man das ”makefile.suite“ ändern und dann starten. Der default scale factor ist 1 GB.
Die Änderungen sehen wie folgt aus:
# Current values for WORKLOAD are: TPCH, TPCR
DATABASE= SQLSERVER
MACHINE = SUN
WORKLOAD = TPCH
Dann kann man DBGEN starten, indem man in einer Konsole in das Verzeichnis wechselt,
wo sich DBGEN befindet, “./dbgen“ eingibt und mit Return bestätigt.
Die Dateien
• customer.tbl
• lineitem.tbl
• nation.tbl
• orders.tbl
• partsupp.tbl
• part.tbl
• region.tbl
• supplier.tbl
werden erstellt. Das dauert ca. 2 Minuten.
28
3. Einrichten der Testumgebung
Nun können diese Dateien mit dem WinSCP auf den Windows-Rechner herunter geladen
werden. Man sollte unbedingt beachten, dass man die Dateien als ”Text“ kopiert.
Jetzt muss man die Tables kreieren. Dazu verwende ich die Datei ”create.txt“ welche man
im Anhang findet. Man speichert dieses als “sql.sql“ ab und kann es dann über die ManagerKonsole im SQL*Plus Worksheet starten, indem man auf “Arbeitsblatt“ klickt und dann auf
”Lokales Skript ausführen...”. Die Tabellen erscheinen;
Abbildung 22: Tabellen
29
3. Einrichten der Testumgebung
3.3.3. Load
Die Tabellen werden mit dem SQL-Loader mit Daten gefüllt. Dazu ist es empfehlenswert, die
im Anhang befindlichen Dateien zu verwenden. Diese Dateien müssen wie folgt angepasst
werden:
In der Datei “importdaten.cmd“ muss der Pfad angepasst werden, je nachdem wo sicher der
SQL-Loader befindet.
In der Datei “importdaten.par“ muss der “userid“ angepasst werden. Die Datei
“importdaten.cmd“ ruft mit jedem Start die Datei “importdaten.par“ auf, also für jede Tabelle
einzeln. Das heisst, in der Datei “importdaten.par“ muss man vor jedem Start die Datei der zu
ladenden Tabelle angeben, also “control = ¡tabellenname¿.ctl“.
Die Dateien <tabellenname>.ctl laden dann die Daten in die entsprechenden Tabellen. Das
heisst, dass man die <tabellenname>.tbl Dateien, die DBGEN erzeugt hat, nacht <tabellenname>.dat umbenennen muss und in den gleichen Ordner kopieren muss.
Ist das gemacht, kann man wie gesagt für jede Tabelle die Datei “importdaten.cmd“ starten.
Bei diesem Vorgang muss die Reihenfolge stimmen, sonst bekommt man Probleme mit den
Schlüsselbeziehungen.
Reihenfolge der Tabellen mit der benötigten Lade-Zeit in Minuten und Sekunden:
1.
2.
3.
4.
5.
6.
7.
8.
region:
nation:
supplier:
part:
partsupp:
customer:
orders:
lineitem:
0:02
0:01
0:04
0:22
1:20
0:17
2:03
16.57
In Oracle 10g müssen Nummer mit ”TO NUMBER(:...)”versehen werden.
30
3. Einrichten der Testumgebung
3.3.4. Indizes erstellen
Nun kann man die Indizes kreieren. Dazu habe ich die Datei “index.txt“ verwendet. Das Vorgehen ist gleich wie beim Kreieren der Tables, man ändert die Datei zu “sql.sql“ ab und führt
sie mit dem SQL-Worksheet aus. Die Datei befindet sich ebenfalls im Anhang.
Sollte beim Laden der Daten in die Tabellen ein Problem auftreten, zum Beispiel ein Fehler
“ora-02291“, dann kann auf der Homepage http://ora-02291.ora-code.com nachsehen, was der Fehler bedeutet, warum es ihn gegeben hat, und wie man ihn behebt.
Im Anhang B befinden sich die verschiedenen Files die in diesem Kapitel angesprochen
wurden. Zusätzliche Informationen finden Sie im “Oracle Database Utilities“ [6].
31
4. Testen
4. Testen
Um die Queries testen zu können, muss man ein Programm schreiben, entweder mit OracleOCI oder mit embeddedSQL und pro*c. Ich habe mich für embeddedSQL entschieden.
4.1. Pro*C
Pro*C ist ein Precompiler von Oracle für die Programmiersprache C und C++. Mittels des
Precompilers ist es möglich, SQL-Ausdrücke und normale C/C++ Quellcode-Elemente miteinander zu vermischen. Die daraus resultierende Datei wird schliesslich in gültigen Quellcode
übersetzt, um diesen mit einem herkömmlichen Compiler übersetzen zu können. Intern werden die im Quellcode eingebetteten SQL-Ausdrücke durch den Precompiler in normale Oracle
Funktionsaufrufe umgewandelt. Mittels Pro*C ist es möglich, mit einer Datenbank innerhalb
eines C-Programmes zu kommunizieren.
Abbildung 23: Pro*C Ablauf
Um Pro*c verwenden zu können, müssen einige Änderungen im Visual Studio vorgenommen werden. Die Änderungen sind im Visual Studio .NET anders, als im früheren Visual
Studio C++. Da es dafür leider noch kein offizielles Handbuch gibt, gehe ich hier detailliert
darauf ein. Das Vorgehen ist wie folgt:
32
4. Testen
1. neues Projekt erstellen, Win32-Konsoleprojekt
2. vorkompilierte Header nicht verwenden, stdafx.cpp und stdafx.h löschen
Abbildung 24: Eigenschaftenseiten
3. .pc-Datei kreieren; Hinzufügen, Neues Element hinzufügen
Abbildung 25: Neues Element hinzufügen
33
4. Testen
4. Rechtsklick auf .pc-Datei, Eigenschaften, Benutzerdef. Buildschritt, Befehlszeile
eingeben:
D:\oracle\product\10.2.0\client 1\BIN\proc C\ARBEIT\dotnet\doku\doku.pc
include=”C:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include”
Der Pfad muss natürlich angepasst werden.
Abbildung 26: Befehlszeile
Im Feld Ausgaben muss folgendes eingetragen werden:
C:\ARBEIT\dotnet\doku\doku.cpp
Auch hier muss der Pfad angepasst werden.
Abbildung 27: Ausgaben
Abbildung 28: Eigenschaften
34
4. Testen
5. Rechtsklick auf doku (Projekt), Hinzufügen, Vorhandenes Element hinzufügen:
D:\oracle\product\10.2.0\client 1\precomp\LIB\msvc ->orasqx10.lib
Abbildung 29: orasqx10.lib
6. Rechtsklick auf Quelldateien, Hinzufügen, Vorhandenes Element hinzufügen:
C:\ARBEIT\dotnet\doku\doku.cpp
Abbildung 30: doku.cpp
35
4. Testen
Dann müssen noch zwei Änderungen vorgenommen werden, die nur einmal gemacht werden
müssen, und dann für alle Projekte gelten:
1. Klicken Sie im Menu auf Extras, Optionen, Projekte, VC++-Verzeichnisse,
Bibliothekdateien und fügen das Verzeichnis hinzu:
D:\oracle\product\10.2.0\client 1\precomp\public
Abbildung 31: Optionen
2. Im Verzeichneis D:\oracle\product\10.2.0\client 1\precomp\admin befindet sich die
Datei: pcscfg.cfg Öffnen Sie diese mit einem Editor und fügen die Zeilen hinzu:
CODE=CPP
PARSE=PARTIAL
Abbildung 32: pcscfg.cfg
Das wars auch schon. Weiterführende Informationen zu Pro*C finden Sie im “Pro*C/C++
Programmers Guide“ [2].
36
4. Testen
4.2. EmbeddedSQL
Embedded SQL ist eine Spracherweiterung von SQL, mit der es möglich ist, SQL-Anweisungen
innerhalb einer strukturierten oder objektorientierten Programmiersprache auszuführen.
Durch Queries ermittelte Informationen müssen in Variable gespeichert werden. Diese Variable sind in der SQL declare section zu definieren.
Bsp.:
EXEC SQL BEGIN DECLARE SECTION
char username[9] = ”TPCHTEST”;
char password[9] = ”TEST”;
char service[9] = ”TEST”;
EXEC SQL END DECLARE SECTION;
Dann kann man den Connect zur Datenbank machen:
EXEC SQL CONNECT: username
IDENTIFIED BY: password
USING: service;
Das select-Statement macht man am besten, indem man einen cursor deklariert:
EXEC SQL DECLARE mein cursor CURSOR FOR select <select-Statement>;
Dann öffnet man den cursor:
EXEC SQL OPEN mein cursor;
und macht einen Fetch:
EXEC SQL FETCH mein cursor INTO :nr, :name...
und schliesst ihn wieder:
EXEC SQL CLOSE mein cursor;
EXEC SQL COMMIT;
37
4. Testen
4.3. Programme erstellen
Der Quellcode der Programme Query1 bis Query22 befindet sich im Anhang C.
Ein solches Programm macht zuerst einen Connect auf die Datenbank, führt die SQLAbfage durch, schreibt das Erbegnis je nach Test-Version auf Konsole oder in eine Datei und
misst die benötigte Zeit.
Zuerst müssen die Programme so gestartet werden, dass man die Ergebnisse mit den Daten im TPC Benchmark H Decision Support vergleichen kann. Das heisst, man verwendet die
gleichen Parameter in den SQL-Abfragen.
4.4. Parameter erzeugen mit QGEN
Für die eigentlichen Test, generiert man die Parameter mit dem Programm QGEN. Dafür startet man auf dem SUSE-Rechner im Verzeichnis wo das Programm ist (bei mir; tpch 20051026)
QGEN indem man in der Konsole “./qgen“ eingibt und mit Return bestätigt.
Wenn man .QGEN ohne nachfolgenden Parameter startet, werden die Parameter für alle
Queries generiert. Man könnte sie auch einzeln generieren mit ./ qgen 1 (für Query1), das
macht jedoch wenig Sinn. Mit jedem Starten von QGEN werden andere Parameter erzeugt.
Das File mit den erstellten Parametern befindet sich im Anhang E.
38
5. Resultate
4.5. Tests
Ich habe verschiedene Tests durchgeführt, mit und ohne Indizes, mit und ohne Ausgabe auf die
Konsole und in die Datei, mit begrenzter Anzahl Zeilen und habe zwischendurch den Server
neu gestartet. Als erstes habe ich natürlich die Validierung gemäss TPC [1] gemacht um die
Ergebnisse vergleichen zu können, damit meine Programme nicht fehlerhaft sind. Hier eine
Übersicht:
Versions-Nr.
V01
V02
V03
V04
V05
V06
V07
V08
V09
V11
V12
V13
V14
V15
V16
valid
mit Indizes
ja
ja
ja
ja
ja
nein
nein
nein
nein
ja
ja
ja
ja
nein
ja
Ausg. auf Konsole
ja
ja
ja
nein
nein
ja
ja
ja
ja
ja
ja
nein
nein
nein
Ausg. in Datei Bemerkungen
ja
ja
bis 15 Zeilen
nein
nein
alle gleichzeitig
nein
nein
ja
bis 15 Zeilen
ja
ja
ja
bis 15 Zeilen
nein
nein
nein
Server neu gestartet
nein
Server neu gestartet
validierung gem. TPC
Die Versionen V01 - V05 habe ich an einem Donnerstag gemacht, alle anderen jeweils am
Wochenende. Die Netzwerkbelastung macht einen kleinen Unterschied. Ich habe noch einige
Tests direkt mit dem SQL-Scrachpad durchgeführt, darauf komme ich im Kapitel Tuning zu
sprechen.
5. Resultate
Die Resultate sind in Excel-Tabellen festgehalten, jeweils mit Graphiken. Sie sind im Anhang
A abgelegt. Interessant ist vorallem das Query 20, welches ohne Indizes bedeutend schneller
läuft, als mit Indizes. Die restlichen Queries laufen eher schneller mit Indizes. Das Query 10
ist dann besonders schnell, wenn es keine Resultate auf die Konsole oder in die Datei schreiben
muss. Ähnlich wie bei Query 10 ist es auch bei Query 16. Die restlichen Queries zeigen nur
kleinere Differenzen. Einige Dateien in denen die Resultate rausgeschrieben wurden, finden
Sie im Anhang C.
39
6. Tuning
6. Tuning
Das Handbuch “Oracle Database Performance Tuning Guide“ [7] enthält ausführliche Informationen zum Tunen und Optimieren der Datenbank und der SQL-Abfragen.
6.1. Explain-Plan
Für jeden SQL-Befehl erstellt der Optimierer einen Ausführungsplan vor der Ausführung. Der
Ausführungsplan besteht aus einer Abfolge von Operationen die Oracle durchführt, wenn ein
SQL-Befehl ausgeführt wird.
Im Ausführungsplan sind enthalten:
• alle referenzierten Tabellen in der verwendeten Reihenfolge
• sämtliche verwendete Zugriffsmethoden auf die Tabellen
• die Join-Methode für die in eine Join-Operation einbezogenen Tabellen
• Operationen wie filter, sort oder aggregation
Zusätzlich zu den Reihen im Quellcode-Baum enthält der Ausführungsplan folgende Informationen:
• Optimierung, wie Kosten und Kardinalität jeder Operation
• Unterteilung der Zugriffe
• Parallele Ausführung, zum Beispiel bei join-Methoden
Der Ausführungsplan hilft zu verstehen, was der Optimierer macht, warum er beispielsweise eine verschachtelte Schlaufe von joins wählt, anstatt ein hash join.
40
6. Tuning
Die üblichen Verfahren für den Tabellenzugriff sind:
• Vollständiger Tablescan: wird üblicherweise verwendet, wenn es bei einer Tabelle keine
oder mehrere ungeeignete Indizes hat. Oder falls beim Zugriff mehr als 20 Prozent der
Tabellendaten gelesen werden müssen.
• Per RowID: Üblicherweise als Ergebnis eines Indexscans. Dies ist die schnellste Zugriffsmethode auf Daten, die in einer Tabelle enthalten sind. Eine RowID verweist direkt
auf eine bestimmte Zeile in einer Tabelle.
• Clusterscan: Nur im Zusammenhang mit Clustern einer Datenbank. Cluster werden (mit
Ausnahme des Data Dictionary) nicht sehr häufig eingesetzt, sodass diese Zugriffsmethode im Allgemeinen nicht zur Anwendung kommt.
• Hash-Scan: Üblicherweise beim Fehlen von Indices, bei ungeeigneten Indices oder beim
Zugriff auf mehr als 20 Prozent der Tabellendaten.
Wenn man im SQL-Scrachpad ein select durchführt, kann man sich anschliessend den
explain-plan anzeigen lassen. Dazu klicken Sie links auf das zweite Symbol von oben.
Abbildung 33: SQL-Scrachpad
Es erscheint das bild des explain-plan. Für detailliertere Angaben, kann man sich den Bericht ansehen. Ich habe dies für die Queries 2, 4, 7, 10 und 20 gemacht und im Anhang abgelegt. Die Queries 7 und 20 sind ohne Indizes schneller, als mit.
Man sieht nicht nur die Operation, die ausgeführt wird, sondern auch die geschätzten Kosten für den jeweiligen Zugriff.
41
6. Tuning
Die Statistik sagt außerdem noch etwas über die Anfragegröße und die Menge der übertragenen
Daten aus.
Abbildung 34: explain-plan
In diesem Bild sieht man, dass der 1. Schritt des Plans, TPCHTEST.PART TABLE ACCESS
ist, d.h. er ruft alle Zeilen aus der Tabelle PART ab. Durch anklicken der einzelnen Reihen,
kann man sich noch weitere Details anzeigen lassen.
Der 2. Schritt des Plans ruft eine oder mehrere ROWIDs in aufsteigender Reihenfolge ab,
indem der B*-Baum-Index mit Index PARTSUPPPARTFK, ohne Index PARTSUPPPK durchsucht wird. Die genauen Pläne sind wie gesagt im Anhang zu finden.
Interessant ist das Query 20, welches ohne Index schneller läuft als mit. Das select-Statement
sieht wie folgt aus:
select sname, saddress from supplier, nation where ssuppkey in ( select pssuppkey from
partsupp where pspartkey in ( select ppartkey from part where pname like ’metallic ’)and
psavailqty > ( select 0.5 * sum(lquantity) from lineitem where lpartkey = pspartkey and lsuppkey = pssuppkey and lshipdate >= date ’1997-01-01’ and lshipdate < date ’1997-01-01’ +
interval ’1’ year))and snationkey = nnationkey and nname = ’MOROCCO’ order by sname;
42
6. Tuning
Im Fall mit Index, werden mehrere NESTED LOOPS (ab Schritt 4) durchgeführt. Die
entsprechenden Zeilenpaare werden gegen die Join-Bedingung getestet, die in der WHEREKlausel der Abfrage angegeben werden.
Im Fall ohne Index, wird einmal weniger NESTED LOOPS (ab Schritt 3) durchgeführt und
dafür ein HASH JOIN (Schritt 6). Eine Hash-Tabelle wird mit den Zeilen erstellt, die aus der
ersten untergeordnetetn Menge zurückgegeben werden. Jede von der zweiten untergeordneten Menge zurückgegebene Zeile wird dann benutzt, um die Hash-Tabelle auf Zeilenpaare zu
überprüfen, die einer Bedingung entsprechen, die in der WHERE-Klausel der Abfrage angegeben wird.
Eine andere Variante zur Analyse von Ausführungsplänen wäre SQL Trace und TKPROF.
Dabei müsste SQL Trace vor der Ausführung des zu protokollierenden Statements aktiviert
werden und während der Ausführung im Hintergrund laufen. SQL Trac kann für eine Session oder eine Instanz aktiviert werden. Duch die Aktivierung von SQL Trace entsteht ein
gewisser Overhead, der die Ergebnisse der Leistungsprotokolle aber in den meisten Fällen
nicht verfälscht, aber bei einer stark ausgelasteten Datenbank zu Problemen führen kann. Das
TKPROF Werkzeug ist ein Kommandozeilenprogramm, das dazu dient, die abgespeicherten
Protokolldateien in ein gewünschtes, aussagekräftiges Format zu wandeln und in einer getrennten Datei abzuspeichern.
Weitere Informationen dazu finden Sie im “Oracle Database Performance Tuning“ [7]. Die
Explain-Plans der Queries 2, 4, 7, 10 und 20 finden Sie im Anhang D.
43
6. Tuning
6.2. Statistik
Wenn wir die Tabellen und Indizes analysieren, erstellt Oracle eine Statistik und speichert sie
im Data Dictionary. Diese Statistiken sollten in regelmässigen Abständen oder nach grösseren
Änderungen aktualisiert werden.
Klicken Sie in der Oracle Enterprise Manager-Konsole auf Extras, Datenbank-Werkzeuge,
Analysieren.
Abbildung 35: Analyse-Assisten
Klicken Sie auf Weiter und wählen Sie drei Tabellen aus.
Abbildung 36: Objektauswahl
44
6. Tuning
Abbildung 37: Tabellen
Klicken Sie nun auf Weiter und dann auf Beenden.
Abbildung 38: Zusammenfassung
Dieser Vorgang dauert ein paar Sekunden.
45
6. Tuning
Abbildung 39: Fertig
Ich habe nun das Query 20 nochmals mit dem SQL-Scrachpad gestartet. Vorher hat es ca.
390 Sekunden gedauert, jetzt dauert es noch 28 Sekunden.
6.3. Optimizer Hints
Die Optimierung läuft vollautomatisch ab und basiert auf Systemstatistiken und Schätzungen
der Ausführungskosten für eine SQL-Abfrage. Diese Optimierungen können die Ausführungsdauer einer SQL-Anfrage stark beschleunigen. Da diese Kostenschätzverfahren nicht perfekt
sind, kann es aber auch zu Fehloptimierungen kommen, die eine unnötig lange Ausführungsdauer zur Folge haben können. Ein wichtiges Merkmal von Oracle besteht in der Möglichkeit
zum Angeben von Optimizer Hints (Hinweisen an den Optimierer). Mit diesen Hinweisen
können Sie den Optimierer veranlassen, einen von Ihnen bestimmten Ausführungspfad für die
Abfrage zu verwenden. So können diese Fehloptimierungen vermeiden werden.
Die Hinweise werden in den Kommentaren zu den SQL-Befehlen SELECT, INSERT und
UPDATE angegeben: Ein Hint beginnt mi /*+ und endet mit */
SELECT /*+ Hint */
<Anweisung>
In Oracle gibt es Hints für die Wahl von:
• Zugriffsmethoden
• Join-Reihenfolgen und Umwandlungen
• Parallelen Operationen (nur auf Mehrprozessor-Rechnern verfügbar)
• Sonstige
46
6. Tuning
Hints für Zugriffsmethoden sind beispielsweise:
• FULL(TABLE): teilt dem Optimierer mit, die angegebene Tabelle vollständig zu durchsuchen (full table-scan)
• HASH(TABLE): teilt dem Optimierer mit, für den Zugriff auf die Tabelle explizit das
Hash-Verfahren anzuwenden.
• ROWID(TABLE): erzwingt das Durchsuchen der RowID für die angegebene Tabelle.
Hints für Join-Operationen sind beispielsweise:
• USE HASH(TABLE): veranlasst Oracle dazu, jede angegebene Tabelle über einen HashJoin mit einer anderen Zeilenquelle zu verknüpfen.
• USE NL(TABLE): zwingt eine verschachtelte Schleife dazu, die angegebene Tabelle
als äussere Tabelle zu verwenden.
Abbildung 40: SQL-Scratchpad
Dieses Beispiel dauert dann noch 20 Sekunden.
47
7. Schluss
7. Schluss
Im Verlauf dieser Arbeit hat sich gezeigt, dass das Testen von Datenbanken mit Benchmarks
zu einigen Problemen führen kann. Es müssen einige Hindernisse überwunden werden, bis
man überhaupt soweit ist, die Tests durchführen zu können. Wenn man sich dann noch den
jeweils neuesten Versionen der einzelnen Software bedient, ist es schwierig genügend Unterstützung in Büchern oder im Internet zu finden. Ich hoffe, dass diese Dokumentation hilft
schneller voran zu kommen und genügend Zeit bleibt, um andere Benchmarks und andere
Datenbank-Systeme zu testen, damit auch ein Vergleich möglich ist.
Zusammenfassend hier nochmals die zentralen Punkte und Probleme der Projektarbeit:
• Installation von Linux -> für Oracle nur SUSE und RedHat unterstüzt
• Installation von Oracle -> Kerneländerungen
• Datenbank erstellen
• Tabellen erzeugen mit DBGEN -> Änderungen im makfile.suite
• Load -> Reihenfolge beachten
• Testprogramme erstellen, Parameter mit QGEN erstellen
• Tests durchführen
• Resultate auswerten
• Tuning
7.1. Ausblick
Man könnte noch einen Refresh machen, das heisst, den Inhalt der Datenbank ändern und
dann die Tests durchführen, wieder den Inhalt ändern, Tests durchführen etc.
Sehr interessant wäre es nun, andere Datenbank-Systeme auf Linux SUSE 10.0 aufzusetzen
und mit dem TPC-H Benchmark zu testen und dann zu vergleichen, ob Oracle schneller oder
langsamer ist. Zudem wäre es sinnvoll, andere Benchmarks zu testen. Ich bin davon überzeugt,
dass die Tests auf Linux-Systemen schneller sind, als auf Windows-Systemen. Es wäre aber
noch interessant zu wissen, ob zum Beispiel RedHat schneller ist als SUSE.
48
Literatur
Literatur
[1] TPC BENCHMARKTM H (Decision Support) Standard Specification Revision 2.3.0
1993 - 2005
[2] Pro*C/C++ Programmers Guide 10g Release 2 (10.2) B14407-01, June 2005
[3] Kevin Loney, Bob Bryla: Oracle Database 10g DBA-Handbuch, Eine High-Performance
Oracle-Datenbank verwalten, Hanser Fachbuchverlag, Oktober 2005
c Database Quick Installation Guide 10g Release 2 (10.2) for Linux x86
[4] Oracle
B15661-01, June 2005
[5] Oracle 10g Release 1(10.1.0.3) on SUSE LINUX Enterprise Server 9 ( How to Install ),
Novell
c Database Utilities 10g Release 2 (10.2) B14215-01, June 2005
[6] Oracle
c Database Performance Tuning 10g Release 2 (10.2) B14211-01, June 2005
[7] Oracle
49
A. Resultate
A. Resultate
A.1. Übersicht über alle Resultate
A.2. Einzelne Versionen mit Graphik
50
B. Datenbank
B. Datenbank
B.1. Tabellen und Indizes kreieren
B.2. Importieren der Daten
B.3. Logfiles der Tabellen
B.4. Parameter der Datenbank
51
C. Queries
C. Queries
C.1. Quellcode der Queries 1 bis 22
C.2. Buildprotokoll eines Programmes
C.3. Einzelne Dateien mit Resultaten
52
D. Tuning
D. Tuning
D.1. Explain-Plans
53
E. TPC-H
E. TPC-H
E.1. Top Ten TPC-H
E.2. Readme zu DBGEN/QGEN
E.3. Generierte Parameter
54
Herunterladen